精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端實(shí)現(xiàn)多文件編譯器

原創(chuàng) 精選
開發(fā) 前端
一個(gè)前端可執(zhí)行的小型打包工具就已實(shí)現(xiàn),可以直接在前端進(jìn)行多文件的編輯和執(zhí)行。實(shí)時(shí)上,此過程僅適用于不方便借助服務(wù)器的場景,如果有條件允許可以借助服務(wù)器,那么編譯過程最好在服務(wù)端完成,甚至還可以借助 webpack 或 rollup 等打包工具實(shí)現(xiàn)更好的編譯效果。

作者 | 景遇

一、概要

在前端工程中,有時(shí)我們需要在瀏覽器編譯并執(zhí)行一些代碼,這種需求常見于低代碼場景中。例如我們在搭建時(shí)需自定義一部分代碼,這些代碼需要在渲染時(shí)執(zhí)行。為了方便起見,我們寫的代碼一定是 ES6 語法,如果要在瀏覽器執(zhí)行,那么就必須經(jīng)過編譯。下面是前端編譯 JS 代碼的一些實(shí)踐。

二、需求描述

  1. 低碼搭建時(shí)需要自定義一部分代碼
  2. 希望代碼是以多文件形式組織的
  3. 可以使用 ESModule 形式導(dǎo)入/導(dǎo)出

三、需求分析

  1. 在瀏覽器編譯代碼必然需要使用 babel 完成;
  2. 如果只有一個(gè) JS 文件,那么可以直接使用 babel 的 transform 函數(shù)編譯
  3. 如果存在多文件,則文件內(nèi)的變量必須相互隔離,且文件之間能夠通過某種形式相互引用,并且需要考慮文件之間的依賴關(guān)

四、核心設(shè)計(jì)

流程

1.變量隔離

由于我們的需求是多文件編輯,各個(gè)文件內(nèi)的變量應(yīng)該相互隔離。最簡單的辦法是將每個(gè)文的內(nèi)容轉(zhuǎn)成一個(gè)閉包,再通過固定的接口將每個(gè)文件連接起來。

假設(shè)有 a.js,內(nèi)容如下:

const a = 1;
const b = 2;

function sum () {
return a + b'
}

sum();

可以將其轉(zhuǎn)為如下形式:

(function() {
const a = 1;
const b = 2;

function sum () {
return a + b'
}

sum();
})();

轉(zhuǎn)成這種形式之后,每個(gè)文件內(nèi)的變量就只會(huì)存在于各自的閉包之內(nèi),互不影響。

五、文件引用

文件之間的相互引用可以通過定義一種接口規(guī)則實(shí)現(xiàn):

  • 所有文件的引用都將通過全局變量 module 進(jìn)行
  • 每個(gè)文件都將對應(yīng)到 module 上的一個(gè)對象,key 根據(jù)文件名而定。

1.導(dǎo)出

原文件:

https://back-media.51cto.com/editor/h6e90be6-D8rA67LO

編譯后:

(function() {
__filename = 'a.js';
const a = 1;
var mod = {};
mod.a = a;
module[__filename] = mod;
})()

2.導(dǎo)入

源文件:

// b.js
import { hello } from './a'

hello();

編譯后:

(function() {
__filename = 'b.js';
var $$a = module['a.js'];
$$a.hello();
var mod = {};
module[__filename] = mod;
})()

六、依賴樹解析

假設(shè)有一堆文件,我們通過解析(babel 或正則)后得到他們之間的關(guān)系如下:

他們之間存在循環(huán)依賴。

根據(jù)這個(gè)依賴圖可以梳理出幾條依賴路線:

  • A -> B -> D -> C -> F -> 循環(huán)依賴B
  • A -> B -> E -> F -> 循環(huán)依賴 B
  • A -> C -> F -> B -> E -> 循環(huán)依賴 F
  • A -> C -> G

從開始出現(xiàn)的第一個(gè)循環(huán)依賴截?cái)嘁蕾嚶肪€,分別統(tǒng)計(jì)統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)的深度,按深度依次放入隊(duì)列中。

如果兩個(gè)節(jié)點(diǎn)深度相同,則分析兩個(gè)節(jié)點(diǎn)的依賴關(guān)系,被依賴的先進(jìn)隊(duì)列,故最終形成的隊(duì)列如下:

  • F E B C D G A

為什么要得到一個(gè)編譯順序呢?

以上得出的編譯順序是為了盡可能解決如下的引用情況,但也不能解決所有:

// a.js
export const a = 2

// b.js
import { a } from 'a.js';
console.log(a + 2);

這時(shí)候,假設(shè)執(zhí)行 b 的時(shí)候,a 還沒被執(zhí)行,那么 b 內(nèi)部拿到的 a 實(shí)際上是 undefined,顯然不是我們所希望的。所以此時(shí)必須保證 a 先于 b 執(zhí)行。

但這種使用方式在存在循環(huán)引用時(shí)無法解決,只能調(diào)整文件組織形式。

事實(shí)上,假設(shè)存在循環(huán)依賴時(shí),下面的在函數(shù)內(nèi)或在類內(nèi)引用方式是沒有問題的,有問題的只是直接使用:

// a.js
export const a = 2

// b.js
import { a } from 'a.js';
export function test () {
return a + 1;
}

這樣,即使 b 有依賴 a,test 只要不是立即執(zhí)行函數(shù)也不會(huì)產(chǎn)生影響。

七、編譯

1.ESModule 轉(zhuǎn)換

此過程可以通過自定義一個(gè) Babel 插件完成,在語法編譯時(shí)將文件編譯成一個(gè)閉包,同時(shí)處理好 ESModule 語法。

該 Babel 插件很簡單,在此就不展開去寫了。

2.文件隊(duì)列編譯

對單個(gè)文件的編譯可封裝成一個(gè)方法,假設(shè)函數(shù)名為:compileFile。

按照上面解析到的文件隊(duì)列按照順序逐個(gè)調(diào)用 compileFile 進(jìn)行編譯,并將結(jié)果直接拼接起來,形成一個(gè)巨大的字符串,該字符串的樣子應(yīng)該是如下的格式:

(function() {
__filename = 'b.js';
var $$a = module['a.js'];
// ...
var mod = {};
module[__filename] = mod;
})();

(function() {
__filename = 'a.js';
var $$b = module['b.js'];
// ...
var mod = {};
module[__filename] = mod;
})();

// ...

3.JS 執(zhí)行

最后一步,執(zhí)行上面得到的編譯結(jié)果即可,此步驟可直接使用 new Function 的方式完成,例如:

(假設(shè)以上的字符串內(nèi)容保存在 compiledScript 中)。

const exec = new Functioon(`
var module = {};
${compiledScript};
return module;
`);

const module = exec();

module['a.js'] // a.js 的導(dǎo)出內(nèi)容
module['b.js'] // b.js 的導(dǎo)出內(nèi)容

八、總結(jié)

至此,一個(gè)前端可執(zhí)行的小型打包工具就已實(shí)現(xiàn),可以直接在前端進(jìn)行多文件的編輯和執(zhí)行。

實(shí)時(shí)上,此過程僅適用于不方便借助服務(wù)器的場景,如果有條件允許可以借助服務(wù)器,那么編譯過程最好在服務(wù)端完成,甚至還可以借助 webpack 或 rollup 等打包工具實(shí)現(xiàn)更好的編譯效果。

參考

目前我們在 ali-lowcode-engine 之上的源碼插件(@ali/lowcode-plugin-code-editor)內(nèi)部實(shí)現(xiàn)了多文件的支持,目前僅做了最簡單的實(shí)現(xiàn):模塊引用直接采用了 UMD 規(guī)范,暫時(shí)也沒有考慮循環(huán)依賴和執(zhí)行順序。

后續(xù)會(huì)嚴(yán)格按照以上步驟進(jìn)行優(yōu)化。

責(zé)任編輯:武曉燕 來源: 阿里開發(fā)者
相關(guān)推薦

2022-11-24 13:05:27

ClangiOS

2010-01-27 16:39:48

C++編譯器

2016-11-08 18:53:08

編譯器

2021-06-25 10:38:05

JavaScript編譯器前端開發(fā)

2021-06-08 07:48:26

lambda表達(dá)式編譯器

2025-01-03 11:43:53

2010-01-21 09:11:38

C++編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-22 18:33:17

C++編譯器

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2017-03-20 18:01:55

編譯器匯編

2009-08-10 17:12:54

C#編譯器

2013-03-29 10:02:37

編譯器語言編譯開發(fā)

2010-10-20 13:43:37

C++編譯器

2019-08-06 08:20:07

編譯器工具開發(fā)者

2015-03-23 10:04:43

c++編譯器c++實(shí)現(xiàn)原理總結(jié)

2020-04-02 15:39:51

代碼編譯器前端

2010-01-13 13:42:55

C++編譯器

2009-07-06 12:49:33

JSP編譯器

2009-08-14 11:34:26

Mono C#編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

一区二区三区四区在线播放| 波多野结衣在线观看视频| 99久久国产免费| 美女av一区| 久久精品国产精品亚洲红杏| 精品欧美久久久| 日韩电影天堂视频一区二区| 久久国产在线观看| 国产精品一区二区免费福利视频| 国产91丝袜在线18| 中文字幕日韩专区| 欧美日韩成人免费视频| 99久久久国产精品无码网爆| 国产一区二区中文| 欧美三级三级三级| 久久久一本精品99久久精品| 青青草原在线免费观看视频| 岛国成人av| 亚洲男人电影天堂| 国产精品对白刺激| 30一40一50老女人毛片| 国产区美女在线| 日韩在线观看| 色综合色狠狠综合色| 国产嫩草一区二区三区在线观看| 成人信息集中地| 日韩免费小视频| 91免费国产在线观看| 欧美日韩国产91| 又色又爽又黄视频| 在线免费观看黄| 日韩精彩视频在线观看| 亚洲精品97久久| 日韩精品视频在线观看视频| wwwxxxx国产| 综合国产在线| 日韩视频中午一区| 青青在线视频免费观看| www.成人在线观看| 丝袜a∨在线一区二区三区不卡| 亚洲精品小视频在线观看| 自拍日韩亚洲一区在线| 日本天堂在线观看| 激情综合色丁香一区二区| 日韩中文在线不卡| 九九热精品国产| 成人性教育av免费网址| 国产肉丝袜一区二区| 国产成人在线亚洲欧美| www亚洲色图| 成人免费看黄| 亚洲一区二区av电影| 国产欧美日韩综合精品二区| 国产熟女一区二区三区四区| 日本美女一区二区三区| 久久精品99无色码中文字幕| 日本成人在线免费观看| 欧美四级在线| 95精品视频在线| 国产精品99蜜臀久久不卡二区| 国产小视频在线观看免费| 欧美美女啪啪| 在线日韩一区二区| 中文字幕一区二区三区在线乱码| 99久久精品无免国产免费| 免费人成精品欧美精品| 欧美精品一区三区| av2014天堂网| 国产综合色在线观看| 亚洲人成伊人成综合网小说| 国产伦视频一区二区三区| 五月天婷婷激情| 亚州av乱码久久精品蜜桃| 91精品欧美久久久久久动漫 | 国产久卡久卡久卡久卡视频精品| 欧美激情视频在线观看| 91av视频免费观看| 操喷在线视频| 亚洲精品国产品国语在线app| 国产四区在线观看| 日本一区视频| 国产在线观看免费一区| 性欧美激情精品| 你懂得视频在线观看| 99精品在免费线中文字幕网站一区| 日韩欧美一区二区三区久久| 性生活免费观看视频| 污视频在线免费| 国产精品影视在线| 成人av网站观看| 在线视频欧美亚洲| 国产婷婷精品| 色综合男人天堂| 国产稀缺真实呦乱在线| 亚洲九九视频| 欧美激情综合色| 国产乱国产乱老熟| 精品在线免费观看| 国产精品久久色| 中文字幕亚洲精品在线| 午夜精彩国产免费不卡不顿大片| 国产性色av一区二区| 稀缺小u女呦精品呦| 9.1麻豆精品| 在线观看亚洲精品视频| 中文字幕日韩综合| 国产精品网址| 尤物九九久久国产精品的特点| 特级西西人体wwwww| 91成人精品在线| 日韩午夜精品视频| aa一级黄色片| 99久久激情| 伊人一区二区三区久久精品 | 国产精品久久久久久久蜜臀| 92国产精品视频| 亚洲视频一区二区三区四区| 国产乱码一区二区三区| 欧美性色黄大片人与善| 日韩电影网址| 亚洲美女屁股眼交3| 黑森林福利视频导航| 黑森林国产精品av| 午夜一区二区三区在线观看| 免费看欧美黑人毛片| 日韩福利一区| 欧美视频一区二| 天堂中文视频在线| 韩国精品主播一区二区在线观看| 日韩亚洲电影在线| 美女三级黄色片| 亚洲不卡av不卡一区二区| 91精品国产九九九久久久亚洲| 日韩精品――中文字幕| 国产一区二区精品久久91| 色狠狠久久av五月综合| av女优在线| 欧美性猛xxx| www.17c.com喷水少妇| 欧美色图五月天| 久久中文精品视频| 五月天婷婷丁香| 国产一区中文字幕| 一级日韩一区在线观看| 国产区在线观看| 亚洲一区二区三区四区不卡| 成人黄色一级大片| 色呦哟—国产精品| 国产精品视频最多的网站| 国产三级按摩推拿按摩| 中文字幕欧美日韩一区| a级黄色片网站| 91国内外精品自在线播放| 欧美一区二区三区在| 中出视频在线观看| 欧美性色综合| 国产成人精品久久久| 同心难改在线观看| 国产精品家庭影院| 日本中文字幕二区| 91精品国产福利在线观看麻豆| 国产精品视频久| 9i精品一二三区| 欧美色爱综合网| 中文字幕91视频| 久久99久久精品| 天天综合中文字幕| 日本综合精品一区| 日韩理论片久久| 五月天综合激情网| 久久精品亚洲精品国产欧美 | 一级 黄 色 片一| 成人爽a毛片免费啪啪红桃视频| 久久国产精品久久国产精品| 精品国产伦一区二区三区| 亚洲精品高清在线| 男人网站在线观看| 久久综合影音| 亚洲精品一卡二卡三卡四卡| segui88久久综合9999| 日韩高清免费在线| 激情四射综合网| 成人午夜短视频| 在线不卡日本| 美国十次综合久久| 中文字幕日本精品| 国产女人高潮的av毛片| 亚洲国产一二三| 国产男女猛烈无遮挡a片漫画| 日本欧美一区二区在线观看| 婷婷视频在线播放| 国产精品18hdxxxⅹ在线| 青青a在线精品免费观看| www.狠狠干| 欧美日韩在线免费观看| 亚洲一区和二区| 99精品全国免费观看视频软件| 亚洲一区二区三| av资源网在线播放| 精品日韩一区二区三区| 亚洲s码欧洲m码国产av| thepron国产精品| a级片一区二区| 欧美一区 二区| 国产九九精品视频| 成人一级福利| 精品激情国产视频| 日韩欧美在线番号| 欧美一区二区三区的| 亚洲综合久久网| 亚洲免费观看高清| 波多野结衣影院| 国产真实乱子伦精品视频| 日本wwww视频| 亚洲伊人春色| 欧亚精品中文字幕| 97影院秋霞午夜在线观看| 5566中文字幕一区二区电影| 日韩欧美一级视频| 一区二区三区日韩欧美精品| 亚洲一二三精品| 麻豆精品视频在线| 国产视频一视频二| 亚洲+变态+欧美+另类+精品| 97精品在线观看| jizzjizz亚洲| 亚洲第一精品电影| 国产成人免费观看视频| 94色蜜桃网一区二区三区| 天天干天天色天天干| 久久久成人网| 五月天亚洲综合| 欧美xxxx在线| 51午夜精品| 91九色美女在线视频| 精品国产欧美一区二区五十路| 国产视频一二三四区| 在线观看视频一区二区欧美日韩| 国产无码精品在线观看| 26uuu另类欧美亚洲曰本| 中国老熟女重囗味hdxx| 久久av老司机精品网站导航| 亚洲狼人综合干| 国精一区二区| 91沈先生在线观看| 国产精品电影| 欧美激情一区二区三级高清视频| 国产不卡在线| 久久精品免费播放| 蜜桃视频在线观看免费视频网站www| 日韩一区和二区| 91亚洲国产成人精品一区| 亚洲成人免费影院| 国产综合精品久久久久成人av| 91免费看视频| 最近中文字幕免费视频| 久久91精品久久久久久秒播| 国产成人黄色网址| 亚洲三级观看| 一本色道久久综合亚洲精品婷婷| 欧美亚洲国产激情| eeuss一区二区三区| 日韩视频一二区| 国产高清精品一区二区| www.久久.com| 国产精品久久久久久久久久久久久久 | 在线播放日韩| 日韩亚洲视频| 日韩一区自拍| 小泽玛利亚av在线| 色棕色天天综合网| 3d动漫精品啪啪一区二区三区免费 | 成人午夜视频免费看| 精品视频站长推荐| 26uuu久久综合| 国产传媒视频在线| 亚洲精品欧美激情| 日韩久久久久久久久| 91久久精品一区二区三区| 美女视频黄免费| 亚洲高清在线视频| 亚洲天堂男人av| 欧美日韩和欧美的一区二区| 日本免费观看视| 一本久久综合亚洲鲁鲁五月天| 中文字幕+乱码+中文| 精品国产户外野外| 欧美日韩在线视频免费| 日本一区二区三区高清不卡 | 99精品国产一区二区三区不卡| 亚洲天堂视频一区| 中文字幕一区二区不卡| 国产在线观看99| 色婷婷国产精品| 国产精品亚洲欧美在线播放| 91国偷自产一区二区开放时间 | 国产高潮视频在线观看| 久久日韩精品一区二区五区| 久久久久久久久久久久国产精品| 99精品国产热久久91蜜凸| 国产黄a三级三级| 午夜精品成人在线| 国产精品老熟女视频一区二区| 亚洲国产精品成人va在线观看| 成年人视频免费在线观看| 亚洲欧美成人在线| 天堂av在线免费| 亚洲的天堂在线中文字幕| 福利片在线观看| 亚洲人免费视频| 全色精品综合影院| 久久夜色精品国产| 欧美成人ⅴideosxxxxx| 亚洲已满18点击进入在线看片| 亚洲第一福利专区| 粉嫩av一区二区三区天美传媒 | 99久久免费观看| 黑丝一区二区| 日日噜噜夜夜狠狠| 97久久人人超碰| 国产大学生自拍| 欧美日韩黄色影视| 国产精品视频一区二区久久| 久久久免费在线观看| а√天堂资源官网在线资源| 国产伦精品免费视频| 九九综合久久| 国内精品在线观看视频| 国产欧美精品| 国产探花一区二区三区| 国产精品色哟哟| 超碰在线观看91| 日韩激情片免费| av日韩中文| 国产高清精品一区| 午夜久久一区| 三级av免费看| 亚洲欧洲精品天堂一级| 久久久久久久久久久网| 欧美丝袜丝交足nylons| 国产一区电影| 操人视频在线观看欧美| 狂野欧美性猛交xxxx| 青青草原成人| 中文字幕亚洲精品乱码| 不卡的av中文字幕| 国产成人精品三级| aaaaaav| 欧美日韩国产在线| 天天操天天干天天干| 91精品国产乱码久久久久久蜜臀 | 欧美大波大乳巨大乳| 国产精品视频免费看| 黄色av网站免费| 亚洲一级黄色av| 成人在线黄色| 亚洲一区二三| 久久66热re国产| 好吊日在线视频| 黑人精品xxx一区| 日本啊v在线| 国产99久久精品一区二区永久免费 | 亚洲欧美一级| 三年中国中文在线观看免费播放| 韩国一区二区三区| 欧美人禽zoz0强交| 欧美日韩精品在线| 免费在线性爱视频| 欧美成年人网站| 视频二区欧美| 精品一区二区三区无码视频| 成人手机在线视频| 少妇太紧太爽又黄又硬又爽| 国产性猛交xxxx免费看久久| 日本国产一区| 欧美日韩国产综合在线| 葵司免费一区二区三区四区五区| 在线观看免费黄色网址| 日韩欧美一区二区久久婷婷| 成人性爱视频在线观看| 国产免费一区视频观看免费| 亚洲老妇激情| 人体私拍套图hdxxxx| 色婷婷久久综合| 免费av毛片在线看| 国产伦精品一区二区三区| 久久精品网址| 国产在线观看免费视频软件| 精品国产sm最大网站| 老司机午夜在线| 国产精品一区二区av| 日韩二区在线观看| 亚洲av无码一区二区三区在线| 日韩欧美一级特黄在线播放| 欧美freesex黑人又粗又大| 国产精品一区视频网站| 青青国产91久久久久久| 91视频免费在线看| 亚洲免费视频一区二区| www欧美在线观看|