精品欧美一区二区三区在线观看 _久久久久国色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)

国产亚洲精久久久久久| 久草视频免费播放| 中文字幕乱伦视频| 91成人午夜| 国产亲近乱来精品视频| 九九热这里只有精品免费看| 日韩成人在线资源| 国产成人无码精品久在线观看 | 国产亚洲精aa在线看| 久久综合久久99| 国内成人精品视频| 久久国产免费视频| 伊人222成人综合网| 成人激情视频| 日本精品视频一区二区三区| 国产一区在线观| 久久久久久国产精品视频| 日本午夜精品久久久久| 国产精品美女久久久久久| 日韩av片免费在线观看| 国产伦精品一区二区三区妓女| 免费污视频在线观看| 国产伦精品一区二区三区在线观看| 一个人看的www久久| 亚洲五月天综合| 国产青青草在线| 久久婷婷丁香| 亚洲人成网站777色婷婷| 亚洲 欧美 日韩 国产综合 在线| 国产高潮流白浆喷水视频| 欧美成人午夜| 日韩美女一区二区三区四区| 国产一区二区三区播放| 亚洲精品人妻无码| 亚洲国产午夜| 日韩精品一区二区三区第95| 777777av| 牛牛电影国产一区二区| 自拍偷拍国产亚洲| 999视频在线免费观看| 欧美精品久久久久性色| 日韩精品首页| 91精品国产综合久久久久久漫画 | 欧洲杯什么时候开赛| 在线视频国内一区二区| 欧美一区二区三区在线播放 | 久久精品日产第一区二区三区乱码 | 久久99久久人婷婷精品综合| 色综合久久99| 中文精品一区二区三区| 超碰福利在线观看| 国产手机视频一区二区| 中文字幕日韩在线播放| 中文字幕在线视频一区二区| 蜜桃麻豆av在线| 国产日韩综合av| 久久综合久久综合这里只有精品| 波多野结衣二区三区| 午夜影院欧美| 亚洲精品v天堂中文字幕| 欧美婷婷精品激情| 性欧美ⅴideo另类hd| 91免费国产在线| 国产欧美日韩91| 精品视频一区二区在线观看| 亚洲女同中文字幕| 日韩黄在线观看| 亚洲va在线va天堂va偷拍| 美女黄视频在线观看| 99麻豆久久久国产精品免费| 国产精品日韩在线播放| 国产一级做a爰片在线看免费| 自拍自偷一区二区三区| 欧美一区二区三区不卡| 人人干人人视频| 欧美天堂视频| 亚洲国产精品久久久久秋霞影院| 亚洲精品成人久久久998| 亚洲成熟女性毛茸茸| 成人精品免费看| 成人精品网站在线观看| 中文字幕超碰在线| 欧美ab在线视频| 欧美国产日产韩国视频| 老司机福利在线观看| 老司机精品在线| 欧美一区二区三区不卡| 亚洲激情 欧美| 国产精品2区| 精品国产污污免费网站入口| 九九九九九国产| 91成人噜噜噜在线播放| 精品亚洲国产成av人片传媒| 国产视频三区四区| 国产色噜噜噜91在线精品 | 久久天天做天天爱综合色| 日韩不卡av| 亚洲区欧洲区| 欧美午夜无遮挡| 国产真实老熟女无套内射| 麻豆传媒视频在线| 午夜久久久久久久久| 天天做天天躁天天躁| 在线高清av| 欧美午夜性色大片在线观看| 亚洲一区二区三区观看| 久久久亚洲欧洲日产| 久久精品小视频| 国产一级淫片久久久片a级| 欧美黄色aaaa| 国产精品永久免费视频| 色播色播色播色播色播在线| bt欧美亚洲午夜电影天堂| 亚洲三区在线| 香蕉视频免费在线播放| 国产精品久久久久久久久动漫| 日韩一区二区三区资源| 日本一本在线免费福利| 欧美亚洲动漫另类| 一级黄色特级片| 亚洲一区导航| 在线播放视频一区| 三级网站在线免费观看| 精品72久久久久中文字幕| 亚洲精品在线看| 国产一级黄色av| 久久99国产精品免费| 91系列在线观看| 精品人妻一区二区三区含羞草| 久久久精品欧美丰满| 欧美精品一区在线| 东热在线免费视频| 黑人巨大精品欧美一区二区三区| 日韩av一二三四| 成人在线视频免费| 欧美一级在线观看| 国产又粗又猛又爽又黄的视频四季| 国产农村妇女精品一区二区| 成人午夜电影在线播放| 偷拍自拍在线| 国产农村妇女精品| 国产女女做受ⅹxx高潮| 国产精品99| 国产亚洲精品va在线观看| 久久嫩草捆绑紧缚| 好吊日精品视频| 日本亚洲欧洲色α| 全国男人的天堂网| 欧美激情一区二区三区不卡| 欧美日韩第二页| 九九久久婷婷| 国产精品国语对白| 成人黄色免费视频| 亚洲一区二区三区在线| 日韩一级免费在线观看| 偷窥自拍亚洲色图精选| 色婷婷av一区二区三区在线观看| 美女视频久久久| 久久成人久久鬼色| 色中文字幕在线观看| 欧美少妇网站| 精品偷拍各种wc美女嘘嘘| 国产精品视频久久久久久久| 美女性感视频久久| 国产乱码精品一区二区三区中文| av网站无病毒在线| 婷婷综合五月天| 永久免费黄色片| 欧美变态网站| 日韩在线欧美在线国产在线| 91精品国产乱码久久| fc2成人免费人成在线观看播放 | 亚洲综合第一区| 国产一区二区久久| 日韩黄色影视| 久久久久毛片| 亚洲美女在线观看| 免费一级特黄特色大片| 2021中文字幕一区亚洲| 在线观看国产中文字幕| 欧美激情五月| 国产一区红桃视频| 久草福利在线视频| 偷拍亚洲欧洲综合| 国产视频不卡在线| 久热精品在线| 亚洲欧美日韩综合一区| 亚洲一区二区三区中文字幕在线观看| 91精品国产91| 亚洲黄色一级大片| 一本久久a久久精品亚洲| 亚洲一级理论片| 丁香婷婷综合五月| 警花观音坐莲激情销魂小说| 三上悠亚国产精品一区二区三区| 国产一区二区三区精品久久久 | 久久久夜色精品| 久久久久久免费毛片精品| 中文av字幕在线观看| 欧美亚洲高清| www.久久爱.cn| 天天综合网站| 亚洲性无码av在线| 精品乱子伦一区二区| 日本韩国一区二区三区视频| 久草视频免费在线| 国产精品久久一级| 欧美色图亚洲激情| 午夜影院日韩| 久久国产欧美精品| 国产欧美视频在线| 国产精品av在线播放| 久草视频在线看| 精品国产电影一区二区| 一级片在线观看视频| 日韩欧美在线国产| 国产一级免费观看| 亚洲欧美日韩久久精品| 成年人性生活视频| 欧美视频福利| 一区二区三区久久网| 真实原创一区二区影院| 国产一区免费在线| www.久久东京| 欧美在线激情视频| 国产1区在线观看| 亚洲大片一区二区三区| 疯狂撞击丝袜人妻| 欧美高清在线视频| 国产探花在线观看视频| 日本va欧美va瓶| 偷拍盗摄高潮叫床对白清晰| 精品99在线| 日本婷婷久久久久久久久一区二区 | freemovies性欧美| 91精品国产一区二区三区香蕉| 久久久久久亚洲av无码专区| 欧美日韩亚洲一区二| 日韩美女黄色片| 国产性色一区二区| v8888av| 久久综合九色综合欧美就去吻| 无码成人精品区在线观看| 久久国产日本精品| 手机福利在线视频| 99久久99视频只有精品| 豆国产97在线| 97久久精品| 国产伦精品一区二区三区四区视频| 爱爱精品视频| 久久99精品久久久久久秒播放器| 欧美亚洲大陆| 九色91国产| 在线观看欧美理论a影院| 欧美精品一区二区三区在线四季 | 亚洲在线播放电影| 国产精品99视频| 在线成人性视频| 亚洲国产成人精品女人| 亚洲精品一区二区三区樱花| 俺要去色综合狠狠| 中文字幕精品—区二区日日骚| 久久久久久久久久久9不雅视频| 国产成人免费高清视频| 国产不卡av一区二区| 欧美日韩精品免费看| 日韩欧美精品| 国产盗摄视频在线观看| 国产一区亚洲| 黄色片一级视频| 免费亚洲电影在线| 免费人成视频在线播放| 成人av网站在线观看免费| 在线 丝袜 欧美 日韩 制服| 国产精品色在线| 免费在线观看一级片| 国产精品久久久爽爽爽麻豆色哟哟| 男女全黄做爰文章| 久久亚洲免费视频| 欧美巨胸大乳hitomi| 亚洲免费观看高清完整版在线观看| 九一在线免费观看| 夜夜精品浪潮av一区二区三区| 情侣偷拍对白清晰饥渴难耐| 亚洲精品乱码久久久久久黑人| 懂色av粉嫩av蜜臀av一区二区三区| 成人欧美一区二区三区黑人麻豆 | 国内久久视频| 免费在线观看的毛片| 国产精品一区二区免费不卡| av小说在线观看| 亚洲视频 欧洲视频| 日本韩国欧美中文字幕| 欧美一区二区视频网站| 欧美日韩在线精品一区二区三区激情综 | 久久精品一区二区三区四区| 色欲一区二区三区精品a片| 欧美国产精品v| 久久久久噜噜噜亚洲熟女综合| 色国产精品一区在线观看| 精品国产av鲁一鲁一区| 亚洲人成电影网站色| 青草影视电视剧免费播放在线观看| 青青青国产精品一区二区| 美女精品久久| 亚洲自拍偷拍第一页| gogo大尺度成人免费视频| 国产一区在线免费观看| 亚洲第一天堂| 精品少妇无遮挡毛片| k8久久久一区二区三区| 一区二区视频免费看| 亚洲精品中文字幕在线观看| 四虎成人在线观看| 91国产视频在线观看| 丰满熟女一区二区三区| 深夜福利一区二区| 二区三区不卡| 国产精品视频大全| 欧美一区 二区| 国产精品日韩三级| 亚洲无毛电影| 污视频网址在线观看| 国产日韩欧美高清在线| 久草国产精品视频| 精品1区2区在线观看| av大片在线| 成人黄色影片在线| 93在线视频精品免费观看| 国产精品12p| 麻豆精品国产传媒mv男同| 91精产国品一二三产区别沈先生| 国产网站一区二区三区| 精品成人av一区二区在线播放| 精品国产乱码久久| 波多野结衣中文在线| 国产精品福利观看| 亚洲区小说区图片区qvod按摩| 久久手机在线视频| 成人夜色视频网站在线观看| 久久久久成人片免费观看蜜芽| 欧美一级黄色录像| 头脑特工队2免费完整版在线观看| 欧美精品第一页在线播放| 正在播放日韩精品| 精品欧美国产一区二区三区不卡| 精品视频99| 一区二区三区免费播放| 国产女人18毛片水真多成人如厕 | 人人精品人人爱| 538精品视频| 欧美日韩激情一区二区| 手机看片国产1024| 最新国产成人av网站网址麻豆| 日韩中文影院| 中文字幕日韩一区二区三区不卡 | xxxwww国产| 欧美日韩免费网站| 国产三级在线免费观看| 国产精品一区=区| 91日韩欧美| 亚洲妇女无套内射精| 午夜电影网亚洲视频| 九色视频网站在线观看| 国产精品日韩电影| 伊人色**天天综合婷婷| 亚洲成人精品在线播放| 26uuu色噜噜精品一区| 午夜婷婷在线观看| 综合网中文字幕| 国产中文欧美日韩在线| 免费网站在线观看视频| 久久综合999| 波多野结衣一区二区三区四区| 日韩一区在线视频| 性感美女一区二区在线观看| 婷婷四房综合激情五月| 国产精品一页| 中文字幕伦理片| 91精品国产91久久久久久一区二区| 在线看一级片| 免费在线成人av电影| 久久99国产乱子伦精品免费| 欧美日韩中文视频| 亚洲图片欧美午夜| 日韩精品一区二区三区中文在线| 天天爽天天狠久久久| 国产在线乱码一区二区三区| 久久高清免费视频| 最近2019好看的中文字幕免费 | 欧美精品亚洲| 国产精品1区2区3区在线观看| 中文字幕伦理片| 日韩久久久久久| 日本一区免费网站| 色女人综合av| 国产成人精品免费一区二区| 欧美偷拍第一页| 亚洲欧洲美洲在线综合| 亚洲高清在线一区|