SM系列网站-swag尤物在线-TS恩静一区二区三区-Ts另类人妖一二三-ts抢先版在线观看-ts清晰版在线观看

資訊

精準傳達 ? 有效溝通

從品牌網站建設到網絡營銷策劃,從策略到執行的一站式服務

前端面試知識點

來源:公司資訊 | 2021.08.19

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

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



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

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



舉個栗子,假設要將 TypeScript 語法轉化成 ES5 語法:

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

支撐解析最新的 ES2020
支撐解析 JSX、Flow & TypeScript
支撐解析實驗性的語法提案(支撐任何 Stage 0 的 PRS)
@babel/parser 首要是根據輸入的字符串流(源代碼)進行解析,最終轉化成規范(根據 ESTree 進行調整)的 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, {
  // 嚴峻形式下解析而且答應模塊定義
  sourceType: ParseSourceTypeEnum.Module,
  // 支撐解析 TypeScript 語法(留心,這兒只是支撐解析,并不是轉化 TypeScript)
  plugins: [ParsePluginEnum.TypeScript],
});


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

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

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, {
  // 嚴峻形式下解析而且答應模塊定義
  sourceType: ParseSourceTypeEnum.Module,
  // 支撐解析 TypeScript 語法(留心,這兒只是可以解析,并不是轉化 TypeScript)
  plugins: [ParsePluginEnum.TypeScript],
});

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

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

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

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

熱門標簽

上一條———————

下一條———————

十七年 建站經驗

多一份參考,總有益處

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

咨詢相關問題或預約面談,可以通過以下方式與我們聯系

業務熱線:400-688-6062 / 大客戶專線   南通:15818561755

主站蜘蛛池模板: 嫩草AV久久伊人妇女超级A | 影院亚洲| 麻豆AV传媒在线播放免费观看 | 欧美巨乳亚洲第一社区 | 久久精品久噜噜噜久久 | 国产麻豆视频免费观看 | 波多野结在线 | 人人干视频在线观看 | 欧美中文字幕在线播放 | 免费三级黄 | 成人深夜视频在线观看 | 亚洲色一色噜一噜噜噜 | 综合图片亚洲综合网站 | 色综合久久98天天综合 | 亚洲精品久久无码AV片动漫网站 | 国产美女视频一区二区三区 | 涩涩AV视频一区二区三区 | 超熟女专门志 | 99精品wwxx在线观看 | 国产精品久久久久久免费 | 黄色网在线 | 夜精品一区二区无码A片 | 欧美性猛交一区二区三区 | 日产精品卡二卡三卡四卡视 | 麻豆影视国产TV在线观看 | 熟妇就是水多18P国产 | 久99久爱精品免费观看视频 | 久久穴 | 天天夜天天干 | 色欲AV亚洲精品一区二区 | 丁香花视频免费播放社区 | 精品综合久久久久97 | 欧美日韩免费播放一区二区 | 国自产拍偷拍精品啪啪色 | 夫妻日本换H视频 | 夜插插| 18女下面流水不遮网站免费 | 日本黄在线 | 国产欧美激情一区二区三区 | 最新伦理电影_伦理电影 | 亚洲国产日韩制服在线观看 |