七件套)
語言運行時編譯器移動開發(fā)【免費下載鏈接】hermesA JavaScript engine optimized for running React Native.項目地址https://gitcode.com/gh_mirrors/hermes/hermes點擊查看免費下載導(dǎo)讀本篇文章圍繞 tools/hermes-parser/js/CHANGELOG.md 記錄的0.9.0至0.37.0版本演進系統(tǒng)梳理 Hermes 引擎 JavaScript 工具鏈中七個 npm 包的定位、核心 API 與關(guān)鍵能力。文章既覆蓋hermes-parser的完整解析選項與各包之間如何協(xié)同也結(jié)合倉庫源碼與各包 README 說明其底層原理幫助讀者理解這套基于 C 編譯器編譯為 WebAssembly 的解析與轉(zhuǎn)換體系并能在 ESLint、Babel、Prettier 等真實工具鏈中直接落地使用。一、包結(jié)構(gòu)總覽一個引擎七個 npm 包Hermes 引擎本身是面向 React Native 優(yōu)化的 JavaScript 引擎其解析器由 C 編寫。tools/hermes-parser/目錄展示了這套體系的服務(wù)端構(gòu)成hermes-parser-wasm.cpp 負(fù)責(zé)將 C 解析器編譯為 WASMHermesParserJSSerializer.cpp 負(fù)責(zé)將解析結(jié)果序列化為 JS 對象HermesParserDiagHandler.cpp 負(fù)責(zé)診斷信息收集。而tools/hermes-parser/js/下的 package.json 是一個 Yarn workspaces 管理的一體化 JS 倉庫由七個發(fā)布到 npm 的包組成包名職責(zé)定位hermes-parser核心解析器暴露parse(code, options)API可解析 ES6、Flow、JSXhermes-estreeHermes 解析器產(chǎn)出的 Flow-ESTree 規(guī)范的 Flow 類型定義hermes-transformAST 遍歷與變換工具可配合 Prettier 打印源碼hermes-eslintESLint 自定義解析器Flow 代碼 lint 的推薦選擇flow-api-translator將 Flow 代碼翻譯為 Flow 定義.flow或 TypeScript 定義.d.tsprettier-plugin-hermes-parserPrettier 插件讓 Prettier 使用 Hermes 解析器打印代碼babel-plugin-syntax-hermes-parserBabel 插件讓 Babel 用hermes-parser替代babel/parserChangelog 中每個版本均按這些包的維度組織條目因此理解這七者的分工是讀懂后續(xù)所有版本演進的前提。二、hermes-parserWASM 化的核心解析器2.1 單個parse函數(shù)與完整配置項hermes-parser的對外 API 只有parse(code, options)一個函數(shù)其完整參數(shù)說明見 tools/hermes-parser/js/hermes-parser/README.mdbabelboolean默認(rèn)false。為true時輸出符合 Babel AST 格式的 AST否則輸出符合 ESTree 格式的 AST。allowReturnOutsideFunctionboolean默認(rèn)false。為true時不報函數(shù)外出現(xiàn) return 語句的錯誤。flowall或detect默認(rèn)detect。設(shè)為detect時僅在文件存在flowpragma 的情況下將歧義語法解析為 Flow 語法設(shè)為all則無論是否存在 pragma 都按 Flow 語法解析。例如fooT(x)在無flow注釋且為detect時會被解析為兩次比較運算而設(shè)為all或帶 pragma 時會被解析為帶類型參數(shù)調(diào)用。sourceFilenamestring默認(rèn)null。非空時該文件名會被寫入 AST 中所有源碼位置信息。sourceTypemodule、script或unambiguous默認(rèn)。unambiguous模式下若代碼中出現(xiàn) ES6 import/export 則自動判定為module否則為script。tokensboolean默認(rèn)false。為true時將所有 token 追加到根節(jié)點的tokens屬性上。transformOptionsobject供相關(guān) transform 使用。目前包含TransformEnumSyntaxenableboolean是否啟用 Flow Enums 語法變換默認(rèn)falsegetRuntime可選() Expression返回指向 Flow Enums 運行時的表達式默認(rèn)require(flow-enums-runtime)。2.2 為什么快C 編譯為 WASMbabel-plugin-syntax-hermes-parser的 README 明確說明Hermes parser uses C compiled to WASM it is significantly faster and provides full syntax support for Flow。也就是說解析核心不是 JS 實現(xiàn)的遞歸下降解析器而是 Hermes 引擎自帶的高性能 C 解析器通過 Emscripten 編譯為 WASM 后在瀏覽器/Node 環(huán)境中運行。Changelog 0.16.0 中Upgrade to latestemscripten(3.1.44 from 3.1.3)這一條也印證了 WASM 工具鏈的持續(xù)升級0.12.0 中Fixprocess.exitCodebeing overridden when initializing WASM則說明 WASM 初始化階段對宿主環(huán)境的侵入也被仔細(xì)處理過。2.3 語法能力隨版本持續(xù)擴張從 changelog 可以清晰看到解析器對語法支持不斷追平 Flow 與 ECMAScript 前沿特性的過程Flow 類型系統(tǒng)0.11.0支持keyof、條件類型ConditionalTypeAnnotation、InferTypeAnnotation、映射對象類型屬性O(shè)bjectTypeMappedTypeProperty、類型謂詞TypePredicate、DeclareEnum類型節(jié)點獨立化0.33.0unknown、never、undefined類型解析為獨立節(jié)點UnknownTypeAnnotation、NeverTypeAnnotation、UndefinedTypeAnnotation協(xié)變/逆變注解0.35.0/0.36.0支持readonly以及writeonly、in T、out T長格式類型參數(shù)變型記錄與模式匹配0.33.0/0.26.0/0.28.0解析 record 聲明與表達式、match實例模式以及持續(xù)迭代的實驗性 Flow 模式匹配支持聲明語法0.11.0DeclareVariable新增kind屬性var/let/constDeclareEnum支持解析JSX 增強0.11.0/0.31.2支持 JSX 元素中的類型參數(shù)、含-的 JSX 標(biāo)識符TC39 新語法0.34.0解析 decoratorsimport ... with取代import ... assert新增async hook與async component語法0.21.0 起支持as const、不精確元組[...]、bigint 成員的 Flow Enums、單邊類型守衛(wèi)implies x is T。同時 AST 結(jié)構(gòu)也在向 ESTree/Flow 規(guī)范對齊例如 0.29.0 將ImportExpression的attributes字段重命名為options0.33.0 將TupleTypeAnnotation.types重命名為elementTypes、superTypeParameters重命名為superTypeArguments——這類破壞性重命名正是為了與 Flow parser 及 ESTree 規(guī)范保持一致。三、hermes-estree類型層的地基hermes-estree提供Flow types for the Flow-ESTree spec produced by the hermes parser見 tools/hermes-parser/js/hermes-estree/README.md即對解析器產(chǎn)出的 AST 節(jié)點的 Flow 類型定義。changelog 中該包的改進反映了類型精度的持續(xù)打磨謂詞與判斷函數(shù)0.10.0新增isExpression、isStatement謂詞函數(shù)0.23.0 采納單邊類型守衛(wèi)implies x is T父節(jié)點強類型0.9.0為小規(guī)模父節(jié)點集合的節(jié)點提供顯式類型化的parent可選鏈字段0.11.0修正MemberExpression在 Flow 中正確暴露optional屬性精確聯(lián)合類型0.16.0改進DestructuringObjectPropertyWithShorthandStaticName、ExportNamedDeclarationWithSpecifiers、ObjectTypeAnnotation、BigIntLiteral等節(jié)點的類型變型字段擴展0.35.0/0.36.0先新增readonly再新增writeonly、in、out到 variance kind 類型中。由于hermes-eslint、hermes-transform等都依賴這套類型定義做作用域分析與變換hermes-estree的類型正確性是整個工具鏈安全的基石。四、hermes-transform可預(yù)測的 AST 變換4.1 設(shè)計理念遍歷可讀、變換可控hermes-transform是traversing and transforming a hermes AST的包其 README 表明它借鑒了babel/traverse、eslint、prettier 三者的實現(xiàn)思路。與直接允許遍歷中原地改 AST 的SimpleTransform不同hermes-transform只在遍歷結(jié)束后統(tǒng)一應(yīng)用變更changelog 0.10.0 明確指出這種end-only模式much easier to reason about but limits what can be achieved。4.2 核心 API 演進transform 主 API0.10.0新增parse、print兩個導(dǎo)出。parse在調(diào)用hermes-parser之后額外執(zhí)行注釋掛接與 docblock 屬性設(shè)置print則通過 Prettier 由 AST 生成源碼并完成 docblock 重新掛回為普通注釋等準(zhǔn)備動作??刂票闅v0.10.0stopTraversal中止整個遍歷skipTraversal跳過當(dāng)前節(jié)點的子樹但繼續(xù)遍歷0.9.0 還提供modifyNodeInPlace直接修改節(jié)點內(nèi)部隱式 clone??寺≌Z義0.9.0大部分 API 會自動對傳入節(jié)點做淺克隆使顯式克隆基本不再必要同時導(dǎo)出MaybeDetachedNode類型與asDetachedNode函數(shù)。注釋工具0.11.0導(dǎo)出makeCommentOwnLine讓新增注釋打印時獨占一行0.17.1 修復(fù)了可選鏈節(jié)點注釋保留問題。Program 級修改0.23.0context.modifyInPlace允許直接修改 Program 節(jié)點本身此前依賴replaceNode無法修改 Program。節(jié)點構(gòu)造器0.10.0提供t.Program({...})這樣的節(jié)點生成器可自底向上構(gòu)造完整 AST。docblock 的處理細(xì)節(jié)值得注意0.10.0 起 docblock 不再掛接到第一個語句而只通過 Program 節(jié)點的docblock屬性訪問避免首語句被移動時注釋被復(fù)制0.23.1 修復(fù)了空body docblock 注釋打印時報錯的問題。五、hermes-eslintFlow 代碼 lint 的推薦解析器hermes-eslint是 ESLint 的自定義解析器官方 README 稱其為the recommended parser for use for linting with Flow code并給出兩種配置方式見 tools/hermes-parser/js/hermes-eslint/README.mdFlat configeslint.config.js將require(hermes-eslint)設(shè)為languageOptions.parser解析選項通過languageOptions.parserOptions傳入Legacy config.eslintrc將hermes-eslint設(shè)為parserparserOptions直接寫在配置對象中。其ParserOptions類型定義包含jsxPragmaJSX 元素創(chuàng)建轉(zhuǎn)譯后所用的標(biāo)識符須為根標(biāo)識符而非成員表達式用React而非React.createElement顯式設(shè)為null可啟用新的全局 JSX transform默認(rèn)ReactjsxFragmentNameJSX fragment 標(biāo)識符默認(rèn)null假定用jsxFactory的成員如React.FragmentsourceTypescript | module默認(rèn)modulefbt忽略fbt /JSX 元素對模塊級React變量的引用計數(shù)FBT 會轉(zhuǎn)譯為非 JSX引用方式不同。changelog 中該包的重點集中在作用域分析的完善0.18.0 將 JSX 閉合元素納入作用域/綁定引用0.19.1 支持DeclareNamespace節(jié)點的作用域分析0.20.1 支持帶類型參數(shù)的typeof節(jié)點0.22.0 修復(fù)映射類型的作用域分析0.9.0 處理 FBT 的fbs標(biāo)簽與函數(shù)類型this參數(shù)0.17.1 確保AsExpression中的類型轉(zhuǎn)換被視為已引用。作用域分析的正確性直接決定no-unused-vars等規(guī)則在 Flow 代碼上的可信度。六、flow-api-translatorFlow 到 TS 定義的雙向翻譯flow-api-translator誕生于 0.10.0其定位是translating Flow code into either Flow definitions or TS definitions along with generating the non typed runtime code目的是幫助 Flow 庫作者同時支持 TS 與 Flow 代碼庫的使用。需注意該包的后續(xù)開發(fā)已遷移至 facebook/flow 倉庫見 tools/hermes-parser/js/flow-api-translator/README.md。changelog 中該包的演進有幾個清晰的脈絡(luò)React 類型體系從 0.11.0 開始逐步支持React.ElementConfig、React.Key、React.Ref、React.Component、React.ElementType、React.ChildrenArray并改進React.ComponentType、React.AbstractComponent0.21.1 支持三參數(shù)形式0.25.0 支持React.RefSetter并移除錯誤的React.Ref翻譯0.28.0 翻譯到ComponentRef替代廢棄的ElementRef0.27.0 改用React.JSX命名空間。Flow 工具類型翻譯0.19.0 讓$ReadOnlyMap/$ReadOnlySet與 Flow API 對齊為兩個類型參數(shù)0.15.0 移除已刪除的$Shape、$Partial0.23.0 將StringPrefixfoo譯為foo${string}、StringPrefixfoo, T譯為foo${T}0.28.0 支持$ArrayBufferView。錯誤恢復(fù)策略0.11.0對不支持的 Flow 語法不再整體退出而是將大多數(shù)錯誤以注釋形式輸出到生成的 TS 代碼中并給出合適的類型回退。通用類型結(jié)構(gòu)0.16.0 支持條件類型、類型守衛(wèi)、infer、映射對象類型0.15.0 支持元組帶標(biāo)簽與 spread 元素、ExportAllDeclaration0.18.1 輸出類型守衛(wèi)代替%checks。與 Prettier 的綁定0.13.0 起切換為始終使用prettier-plugin-hermes-parser打印以支持最新 Flow 語法0.30.0 修復(fù) Prettier v3 支持0.37.0 要求 Prettier v3 并輸出TSImportType.source為$Exports而生。七、prettier-plugin-hermes-parser讓打印追上解析該插件的用途是讓 Prettier 以 Hermes 解析器解析 Flow 代碼并打印從而支持 Prettier 官方插件尚未跟上的最新 Flow 語法。README 中的配置方式見 tools/hermes-parser/js/prettier-plugin-hermes-parser/README.md// .prettierrc { plugins: [prettier-plugin-hermes-parser], overrides: [ { files: [*.js, *.jsx, *.flow], options: { parser: hermes } } ] }關(guān)鍵版本節(jié)點0.12.0 創(chuàng)建同時支持 Prettier v3 與 v2但打印邏輯始終走最新的 Prettier v3以完整支持 Hermes parser 的全部特性0.12.1 性能優(yōu)化插件懶加載未使用時零性能影響從內(nèi)置 Prettier v3 bundle 中剝離 Flow parser縮短插件初始化時間0.13.0 修復(fù)上游缺陷修補 Prettier 打印hermes-transform產(chǎn)出的數(shù)組時無限遞歸的問題0.31.0 移除 Prettier v2與hermes-transform同步放棄 v20.37.0 新方向hermes-transform改為直接用 Prettier 內(nèi)置的 Flow 與 TypeScript 插件打印僅在需要時按需加載prettier-plugin-hermes-parser。八、babel-plugin-syntax-hermes-parser接管 Babel 的解析階段該包創(chuàng)建于 0.13.0將 Babel 的解析器從babel/parser替換為hermes-parser從而獲得更快的解析速度與完整的 Flow 語法支持C 編譯為 WASM。用法見 tools/hermes-parser/js/babel-plugin-syntax-hermes-parser/README.mdnpm install --save-dev babel-plugin-syntax-hermes-parser # 或 yarn add babel-plugin-syntax-hermes-parser --dev// babel.config.json { plugins: [babel-plugin-syntax-hermes-parser] }需要向解析器傳參時使用parserOpts// babel.config.json { plugins: [babel-plugin-syntax-hermes-parser], parserOpts: { allowReturnOutsideFunction: true } }該插件值得注意的邊界處理0.18.1 起不對 TS 文件啟用插件0.25.1 新增parseLangTypes選項跳過非 Flow 文件0.20.1 支持 Babel 8 beta。九、貫穿版本的工程質(zhì)量與破壞性變更從 changelog 可總結(jié)出幾條貫穿始終的工程主線破壞性重命名均為對齊生態(tài)attributes→options、types→elementTypes、superTypeParameters→superTypeArguments以及falseTYpe→falseType0.11.0 修正 TS 節(jié)點拼寫錯誤都是為了與 ESTree/Flow parser 規(guī)范保持一致。babel 模式輸出持續(xù)對齊0.16.0 對 babel 支持基礎(chǔ)設(shè)施做了重大重構(gòu)使 transform 更安全容易且輸出更貼近babel/parser0.15.0 將MethodDefinition正確轉(zhuǎn)為ClassPrivateMethod0.13.0 剝離PropertyDefinition節(jié)點上 TS 專用的tsModifiers。依賴治理嚴(yán)苛0.10.1 移除對hermes-eslint的未聲明依賴以避免模塊找不到錯誤0.15.0 為hermes-transform增加prettier-plugin-hermes-parser的 peer dependency0.11.1 修復(fù)依賴版本。配置默認(rèn)值的安全設(shè)計0.33.2 將 Flow Enums transform 改為默認(rèn)關(guān)閉需顯式傳入transformOptions: {TransformEnumSyntax: {enable: true}}0.23.0 為hermes-parser新增reactRuntimeTarget配置默認(rèn)18設(shè)為19時不再為函數(shù)組件添加forwardRef包裝因為 React 19 將 ref 視為普通 prop。十、如何在當(dāng)前倉庫中深入驗證解析選項完整閱讀 tools/hermes-parser/js/hermes-parser/README.md 中的參數(shù)表WASM 構(gòu)建鏈路查看 tools/hermes-parser/CMakeLists.txt、hermes-parser-wasm.cpp 與 HermesParserJSSerializer.cpp了解 C 解析器如何序列化給 JS 消費測試用例tools/hermes-parser/js/tests/ 與各包內(nèi)__tests__目錄中的快照測試是理解各類 Flow 語法在 AST 中具體形態(tài)的最佳入口作用域分析實現(xiàn)tools/hermes-parser/js/hermes-eslint/src/scope-manager/README.md 說明 ESLint 作用域分析的內(nèi)部結(jié)構(gòu)monorepo 構(gòu)建與測試tools/hermes-parser/js/package.json 中的build./scripts/build.sh、lint、flow、test腳本展示了整套工具的工程化流程。結(jié)語從 0.9.0 到 0.37.0Hermes parser 的 JS 工具鏈完成了一次解析能力追平語法、打印能力追平解析的螺旋式演進以 WASM 化的hermes-parser為核心hermes-estree提供類型地基hermes-eslint與babel-plugin-syntax-hermes-parser將解析能力注入主流工具鏈hermes-transform與prettier-plugin-hermes-parser支撐代碼變換與格式化flow-api-translator打通 Flow 與 TypeScript 之間的類型翻譯。理解這七件套的分工與版本脈絡(luò)無論是排查解析問題、接入 ESLint/Babel/Prettier還是實現(xiàn)自己的 AST 變換都能做到有據(jù)可依。贊分享語言運行時編譯器移動開發(fā)【免費下載鏈接】hermesA JavaScript engine optimized for running React Native.項目地址https://gitcode.com/gh_mirrors/hermes/hermes點擊查看免費下載相關(guān)推薦Hermes Parser JS 包開發(fā)指南WASM 解析器的構(gòu)建、測試與包結(jié)構(gòu)全解析Hermes Parser JS 包開發(fā)指南WASM 解析器的構(gòu)建、測試與包結(jié)構(gòu)全解析 本指南以 tools/hermes parser/js/CLAUDE.語言運行時編譯器移動開發(fā)Hermes 引擎的 Prettier 插件 prettier-plugin-hermes-parser 演進解析Flow 前沿語法格式化與版本兼容全指南Hermes 引擎的 Prettier 插件 prettier plugin hermes parser 演進解析Flow 前沿語法格式化與版本兼容全指南 導(dǎo)語言運行時編譯器移動開發(fā)AssetRipper工具鏈配套工具生態(tài)全面解析AssetRipper工具鏈配套工具生態(tài)全面解析 AssetRipper作為Unity資源提取領(lǐng)域的標(biāo)桿工具其強大之處不僅在于核心的資產(chǎn)提取能力更在于其完開發(fā)工具逆向工程游戲開發(fā)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考