人成在线免费视频|久久久久成人国产免费|亚洲成a人片4444|初尝人妻少妇中文字幕XX|久久综合婷婷噜噜综合网站|粉嫩小泬无遮挡久久久久久|国产精品午夜无码AV天美传媒|欧美日韩专区国产精品一区二区

  • 
    
    <center id="sdblb"></center>
    <style id="sdblb"><meter id="sdblb"></meter></style>
    <source id="sdblb"><optgroup id="sdblb"></optgroup></source>
    <center id="sdblb"></center>
    <sub id="sdblb"></sub>

      <sub id="sdblb"></sub>
        <noscript id="sdblb"><meter id="sdblb"></meter></noscript>
        資訊

        精準傳達 ? 有效溝通

        從品牌網(wǎng)站建設(shè)到網(wǎng)絡(luò)營銷策劃,從策略到執(zhí)行的一站式服務(wù)

        前端面試知識點

        來源:公司資訊 | 2021.08.19

        1、簡略描繪一下 Babel 的編譯進程?
        Babel 是一個源到源的轉(zhuǎn)化編譯器(Transpiler),它的首要作用是將 JavaScript 的高版別語法(例如 ES6)轉(zhuǎn)化成低版別語法(例如 ES5),然后可以適配瀏覽器的兼容性。

        溫馨提示:假設(shè)某種高級言語或許運用言語(例如用于人工智能的計算機規(guī)劃言語)轉(zhuǎn)化的政策言語不是特定計算機的匯編言語,而是面向另一種高級程序言語(許多研究性的編譯器將 C 作為政策言語),那么還需求將政策高級程序言語再進行一次額外的編譯才干得到終究的政策程序,這種編譯器可稱為源到源的轉(zhuǎn)化器。



        從上圖可知,Babel 的編譯進程首要可以分為三個階段:

        解析(Parse):包括詞法分析和語法分析。詞法分析首要把字符流源代碼(Char Stream)轉(zhuǎn)化成令牌流( Token Stream),語法分析首要是將令牌流轉(zhuǎn)化成籠統(tǒng)語法樹(Abstract Syntax Tree,AST)。
        轉(zhuǎn)化(Transform):經(jīng)過 Babel 的插件才干,將高版別語法的 AST 轉(zhuǎn)化成支撐低版別語法的 AST。當然在此進程中也可以對 AST 的 Node 節(jié)點進行優(yōu)化操作,比如增加、更新以及移除節(jié)點等。
        生成(Generate):將 AST 轉(zhuǎn)化成字符串形式的低版別代碼,一同也能創(chuàng)立 Source Map 映射。
        具體的流程如下所示:



        舉個栗子,假設(shè)要將 TypeScript 語法轉(zhuǎn)化成 ES5 語法:

        // 源代碼
        let a: string = 1;
        // 政策代碼
        var a = 1;
        拷貝代碼
        1
        2
        3
        4
        5
        1.1 解析(Parser)
        Babel 的解析進程(源碼到 AST 的轉(zhuǎn)化)可以運用 @babel/parser,它的首要特色如下:

        支撐解析最新的 ES2020
        支撐解析 JSX、Flow & TypeScript
        支撐解析實驗性的語法提案(支撐任何 Stage 0 的 PRS)
        @babel/parser 首要是根據(jù)輸入的字符串流(源代碼)進行解析,最終轉(zhuǎn)化成規(guī)范(根據(jù) ESTree 進行調(diào)整)的 AST,如下所示:

        import { parse } from '@babel/parser';
        const source = `let a: string = 1;`;

        enum ParseSourceTypeEnum {
          Module = 'module',
          Script = 'script',
          Unambiguous = 'unambiguous',
        }

        enum ParsePluginEnum {
          Flow = 'flow',
          FlowComments = 'flowComments',
          TypeScript = 'typescript',
          Jsx = 'jsx',
          V8intrinsic = 'v8intrinsic',
        }

        // 解析(Parser)階段
        const ast = parse(source, {
          // 嚴峻形式下解析而且答應(yīng)模塊定義
          sourceType: ParseSourceTypeEnum.Module,
          // 支撐解析 TypeScript 語法(留心,這兒只是支撐解析,并不是轉(zhuǎn)化 TypeScript)
          plugins: [ParsePluginEnum.TypeScript],
        });


        需求留心,在 Parser 階段首要是進行詞法和語法分析,假設(shè)詞法或許語法分析錯誤,那么會在該階段被檢測出來。假設(shè)檢測正確,則可以進入語法的轉(zhuǎn)化階段。

        1.2 轉(zhuǎn)化(Transform)
        Babel 的轉(zhuǎn)化進程(AST 到 AST 的轉(zhuǎn)化)首要運用 @babel/traverse,該庫包可以經(jīng)過訪問者形式主動遍歷并訪問 AST 樹的每一個 Node 節(jié)點信息,然后完成節(jié)點的替換、移除和增加操作,如下所示:

        import { parse } from '@babel/parser';
        import traverse from '@babel/traverse';

        enum ParseSourceTypeEnum {
          Module = 'module',
          Script = 'script',
          Unambiguous = 'unambiguous',
        }

        enum ParsePluginEnum {
          Flow = 'flow',
          FlowComments = 'flowComments',
          TypeScript = 'typescript',
          Jsx = 'jsx',
          V8intrinsic = 'v8intrinsic',
        }

        const source = `let a: string = 1;`;

        // 解析(Parser)階段
        const ast = parse(source, {
          // 嚴峻形式下解析而且答應(yīng)模塊定義
          sourceType: ParseSourceTypeEnum.Module,
          // 支撐解析 TypeScript 語法(留心,這兒只是可以解析,并不是轉(zhuǎn)化 TypeScript)
          plugins: [ParsePluginEnum.TypeScript],
        });

        // 轉(zhuǎn)化(Transform) 階段
        traverse(ast, {
          // 訪問變量聲明標識符
          VariableDeclaration(path) {
            // 將 const 和 let 轉(zhuǎn)化為 var
            path.node.kind = 'var';
          },
          // 訪問 TypeScript 類型聲明標識符
          TSTypeAnnotation(path) {
            // 移除 TypeScript 的聲明類型
            path.remove();
          },
        });

        關(guān)于 Babel 中的訪問器 API,這兒不再過多說明,假設(shè)想了解更多信息,可以檢查 Babel 插件手冊。除此之外,你可能現(xiàn)已留心到這兒的轉(zhuǎn)化邏輯其實可以理解為完成一個簡略的 Babel 插件,只是沒有封裝成 Npm 包。當然,在實在的插件開發(fā)開發(fā)中,還可以合作 @babel/types 工具包進行節(jié)點信息的判別處理。

        溫馨提示:這兒只是簡略的一個 Demo 示例,在實在轉(zhuǎn)化 let、const 等變量聲明的進程中,還會遇到處理暫時性死區(qū)(Temporal Dead Zone, TDZ)的狀況,更多具體信息可以檢查官方的插件 babel-plugin-transform-block-scoping。

        —— 靈通云微信公眾號 ——

        熱門標簽

        上一條———————

        下一條———————

        十七年 建站經(jīng)驗

        多一份參考,總有益處

        聯(lián)系靈通云,免費獲得專屬《策劃方案》及報價

        咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

        業(yè)務(wù)熱線:400-688-6062 / 大客戶專線   南通:15818561755

        临沂市| 肇东市| 民勤县| 兴仁县| 吉林市| 四子王旗| 中山市| 沾益县| 白河县| 上饶市| 南投县| 三亚市| 龙游县| 西峡县| 临沭县| 衡阳市| 丰原市| 朝阳县| 鄂伦春自治旗| 格尔木市| 孙吴县| 威宁| 定西市| 唐山市| 峡江县| 乐都县| 台州市| 日照市| 游戏| 扎鲁特旗| 丽江市| 渝中区| 蓬莱市| 开封县| 绵阳市| 夏河县| 万盛区| 南华县| 安岳县| 柳州市| 武山县|