鏈枃宸叉暣鐞嗗埌Github锛屽湴鍧€馃憠鍗氬銆傚鏋滄垜鐨勫唴瀹瑰浣犳湁甯姪锛屾杩庣偣涓猄tar馃帀馃帀馃帀榧撳姳:)~~甯屾湜鎴戠殑鍐呭鑳藉府鍒颁綘銆傜洰鍓嶆垜涓撴敞浜庡墠绔紝浣嗘垜涔熶細鍦ㄦ湁闄愮殑鏃堕棿鍐呭垎浜垜鐨勬墍瑙佹墍闂汇€傛湰鏂囩殑妯″潡鎵撳寘鍣ㄦ潵鑷ず渚婱inipack锛屽悗闈㈡垜浠細涓€姝ユ鐪嬪畠鏄浣曞疄鐜扮殑銆傞鍏堬紝鎴戜滑鍏堜簡瑙d竴涓嬫ā鍧楁墦鍖呭櫒闇€瑕佷緷璧栫殑babel鎻掍欢锛欯babel/traverse鈥斺€旂淮鎶ゆ暣妫垫爲鐨勭姸鎬侊紝璐熻矗鏇挎崲銆佸垹闄ゅ拰娣诲姞鑺傜偣銆侤babel/core鈥擝abel缂栬瘧鍣ㄦ牳蹇冦€侤babel/parser鈥擝abel涓娇鐢ㄧ殑JavaScript瑙f瀽鍣ㄣ€侤babel/preset-env鈥旀瘡涓幆澧冪殑Babel棰勮銆傞€氳繃鏍规嵁鐩爣娴忚鍣ㄦ垨杩愯鏃剁幆澧冭嚜鍔ㄧ‘瀹氭墍闇€鐨凚abel鎻掍欢鍜宲olyfill锛屽皢ES6+缂栬瘧涓篍S5銆傛垜浠浛鎹簡鍚堝苟鍒癰abel涓殑绀轰緥鐨勬棫鎻掍欢銆傛惌寤轰竴涓畝鍗曠殑妯″潡鎵撳寘鍣ㄥ彧闇€瑕佷笁姝ワ細浣跨敤babel瀹屾垚浠g爜杞崲锛岀敓鎴愬崟涓枃浠剁殑渚濊禆鐢熸垚渚濊禆鏄犲皠鐢熸垚鏈€缁堢殑鎵撳寘浠g爜锛屽浠g爜杩涜杞崲锛岀敓鎴愪緷璧栥€傞鍏堬紝鎴戜滑鍒涘缓涓€涓猚reateAsset()鍑芥暟锛屽畠灏嗘帴鍙椾竴涓枃浠跺悕鍙傛暟锛堟枃浠惰矾寰勶級锛岃鍙栧唴瀹瑰苟鎻愬彇鍏朵緷璧栭」銆俢onstfs=require('fs')functioncreateAsset(filename){constcontent=fs.readFileSync(filename,'utf-8')}鎴戜滑浣跨敤fs.readFileSync璇诲彇鏂囦欢骞惰繑鍥炴枃浠跺唴瀹广€傛牴鎹叾鍐呭锛屾垜浠彲浠ュ緱鍒板鍏ュ瓧绗︿覆锛堜緷璧栨枃浠讹級銆傝繖閲屾垜浠娇鐢ㄤ簡涓€涓狫avaScript瑙f瀽鍣ㄢ€斺€擛babel/parser锛岃繖鏄竴涓槄璇诲拰鐞嗚ВJavaScript浠g爜鐨勫伐鍏枫€傚畠浜х敓浜嗕竴涓洿鎶借薄鐨勬ā鍨嬶紝绉颁负AST锛堟娊璞¤娉曟爲锛夈€侫ST鍖呭惈浜嗗緢澶氬叧浜庢垜浠唬鐮佺殑淇℃伅銆傛垜浠彲浠ユ煡璇㈠畠浠ヤ簡瑙f垜浠殑浠g爜璇曞浘鍋氫粈涔堛€俢onstparser=require('@babel/parser')functioncreateAsset(filename){//...constast=parser.parse(content,{sourceType:'module'//璇嗗埆ES妯″潡})console.log(ast)}鎺ヤ笅鏉ワ紝鎴戜滑閬嶅巻AST浠ュ皾璇曚簡瑙h妯″潡渚濊禆浜庡摢浜涙ā鍧椼€俢onsttraverse=require('@babel/traverse').defaultfunctioncreateAsset(filename){//...//瀛樺偍妯″潡鐨勭浉瀵硅矾寰刢onstdependencies=[]traverse(ast,{//鑾峰彇寮曞叆鐨勬ā鍧梚mportImportDeclaration({node}){//淇濆瓨渚濊禆妯″潡dependencies.push(node.source.value)}})}鎴戜滑鐭ラ亾ES妯″潡鏄潤鎬佺殑锛岃繖鎰忓懗鐫€浣犱笉鑳藉鍏ヤ竴涓彉閲忥紝鎴栬€呮湁鏉′欢鍦板鍏ュ彟涓€涓ā鍧椼€傛瘡褰撴垜浠湅鍒癷mport璇彞鏃讹紝鎴戜滑閮藉彲浠ュ皢鍏跺€艰涓轰緷璧栭」銆傛垜浠繕閫氳繃閫掑涓€涓畝鍗曠殑璁℃暟鍣ㄦ潵涓鸿妯″潡鍒嗛厤涓€涓敮涓€鏍囪瘑绗︼細letID=0functioncreateAsset(filename){//...constid=ID++}鎴戜滑浣跨敤鍙兘涓嶆敮鎸佹墍鏈夋祻瑙堝櫒鐨凟S妯″潡鍜屽叾浠朖avaScript鍔熻兘銆備负浜嗙‘淇濇垜浠殑鍖呭湪鎵€鏈夋祻瑙堝櫒涓繍琛岋紝鎴戜滑灏嗕娇鐢╞abel鏍稿績搴揵abel-core鏉ヨ浆鎹㈠畠銆俢onst{transformFromAst}=require('@babel/core')functioncreateAsset(filename){//...const{code}=transformFromAst(ast,null,{presets:['@babel/preset-env']})return{id,filename,dependencies,code}}presets閫夐」鏄竴缁勮鍒欙紝鍛婅瘔babel濡備綍杞瘧鎴戜滑鐨勪唬鐮併€傚畠鍦ㄥ唴閮ㄤ娇鐢╞abel-preset-env鍖呭皢鎴戜滑鐨勪唬鐮佽浆鎹负娴忚鍣ㄥ彲浠ヨ繍琛岀殑浠g爜銆傛渶鍚庯紝鎴戜滑杩斿洖鍏充簬杩欎釜妯″潡鐨勬墍鏈変俊鎭€俰d鈥旀ā鍧楃殑鍞竴IDfilename鈥旀ā鍧楃殑鐩稿鏂囦欢璺緞dependencies鈥斿綋鍓嶆ā鍧楃殑渚濊禆妯″潡锛屽鏋滄病鏈夊垯杩斿洖涓€涓┖鏁扮粍[]code鈥旀ā鍧楃殑缂栬瘧浠g爜鐢熸垚渚濊禆鍥剧幇鍦ㄦ垜浠彲浠ユ彁鍙栧崟涓ā鍧楃殑渚濊禆锛屾垜浠皢浠庡叆鍙e叆鍙f枃浠剁殑渚濊禆寮€濮嬨€傛垜浠皢鎻愬彇鍏舵瘡涓緷璧栭」鐨勪緷璧栭」锛屼緷娆″惊鐜紝鐩村埌鎴戜滑浜嗚В搴旂敤绋嬪簭涓殑姣忎釜妯″潡浠ュ強瀹冧滑濡備綍鐩镐簰渚濊禆銆傝繖绉嶉」鐩悊瑙gО涓轰緷璧栧浘銆傞鍏堟垜浠啓涓€涓猚reateGraph()鍑芥暟锛屼紶鍏ュ叆鍙f枃浠讹紝瑙f瀽鏁翠釜鏂囦欢銆俧unctioncreateGraph(entry){constmainAsset=createAsset(entry)constqueue=[mainAsset]}鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑杩樺畾涔変簡涓€涓彧鏈夊叆鍙h祫婧愮殑闃熷垪鏁扮粍锛岀敤鏉ヨВ鏋愬悇涓祫婧愮殑渚濊禆鍏崇郴銆備娇鐢╢or...of寰幆閬嶅巻闃熷垪銆傛渶鍒濋槦鍒楀彧鏈変竴涓祫婧愶紝浣嗘槸褰撴垜浠鍏惰繘琛岃凯浠f椂锛屾垜浠皢棰濆鐨勬柊璧勬簮鎺ㄩ€佸埌闃熷垪涓€俢onstpath=require('path')functioncreateGraph(entry){//...for(constassetofqueue){//瀛樺偍渚濊禆妯″潡鍜岀浉搴旂殑鍞竴IDasset.mapping={}//妯″潡鎵€鍦ㄧ殑鐩綍locatedconstdirname=path.dirname(asset.filename)//閬嶅巻瀹冪殑鐩稿璺緞鍒楄〃锛屽緱鍒板畠浠殑渚濊禆asset.dependencies.forEach((relativePath)=>{//createAsset闇€瑕佺粷瀵硅矾寰勶紝浣嗘槸渚濊禆琚繚瀛樼浉瀵逛簬鍏舵枃浠剁殑鐩稿璺緞鏁扮粍//鎴戜滑鍙互閫氳繃灏嗙浉瀵硅矾寰勪笌鐖惰祫婧愮洰褰曠殑璺緞杩炴帴璧锋潵锛屽皢鐩稿璺緞杞崲涓虹粷瀵硅矾寰刢onstabsolutePath=path.join(dirname,relativePath)//瑙f瀽璧勬簮锛岃鍙栧畠鐨勫唴瀹瑰苟鎻愬彇瀹冪殑渚濊禆constchild=createAsset(absolutePath)//閫氳繃娣诲姞涓€涓柊鐨勫睘鎬hild.id鏉ヨ〃杈捐繖绉嶄竴瀵逛竴鐨勫叧绯籥sset.mapping瀵规垜浠悊瑙h祫浜т緷璧栦緷璧栦簬child寰堥噸瑕乕relativePath]=child.id//鏈€鍚庢垜浠皢瀛愯祫婧愬帇鍏ラ槦鍒楋紝杩欐牱瀹冪殑渚濊禆涔熶細琚凯浠hВ鏋恞ueue.push(child)})}returnqueue}姝ゆ椂queue鏄竴涓暟缁勶紝鍖呭惈鐩爣搴旂敤绋嬪簭涓殑姣忎釜妯″潡锛岃繖鏄垜浠殑渚濊禆鍏崇郴鍥俱€傜敓鎴愬寘浣滀负鏈€鍚庝竴姝ワ紝鎴戜滑瀹氫箟涓€涓寘鍑芥暟锛屽畠灏嗕娇鐢ㄦ垜浠殑鍥惧舰骞惰繑鍥炰竴涓彲浠ュ湪娴忚鍣ㄤ腑杩愯鐨勫寘銆俧unctionbundle(graph){letmodules=''graph.forEach((mod)=>{modules+=`${mod.id}:[function(require,module,exports){${mod.code}},${JSON.stringify(mod.mapping)},],`})}鍥句腑鐨勬瘡涓ā鍧楀湪姝ゅ璞′腑閮芥湁涓€涓潯鐩紙鍗虫枃浠跺悕锛夈€傛垜浠娇鐢ㄦā鍧楃殑id浣滀负閿紝涓€涓暟缁勪綔涓哄€硷紙鏁扮粍鏄洜涓烘垜浠湪姣忎釜妯″潡涓湁2涓€硷級銆傜涓€涓€兼槸鐢ㄥ嚱鏁板寘瑁呯殑姣忎釜妯″潡鐨勪唬鐮併€傝繖鏄洜涓烘ā鍧楀簲璇ユ槸鏈変綔鐢ㄥ煙鐨勶細鍦ㄤ竴涓ā鍧椾腑瀹氫箟鐨勫彉閲忎笉浼氬奖鍝嶅叾浠栨ā鍧楁垨鍏ㄥ眬浣滅敤鍩熴€傛垜浠殑妯″潡鍦ㄩ€氳繃babel杞瘧鍚庝娇鐢–ommonJS妯″潡绯荤粺锛氬畠浠湡鏈況equire銆乵odule鍜宔xports瀵硅薄鍙敤銆傝€岃繖浜涙柟娉曞湪娴忚鍣ㄤ腑閫氬父鏄笉鍙敤鐨勶紝鎵€浠ユ垜浠疄鐜板畠浠苟灏嗗畠浠敞鍏ュ埌鍑芥暟鍖呰鍣ㄤ腑銆傚浜庣浜屼釜鍊硷紝鎴戜滑浣跨敤stringify鏉ヨВ鏋愭ā鍧椾笌鍏朵緷璧栭」涔嬮棿鐨勫叧绯伙紙涔熷氨鏄笂闈㈢殑asset.mapping锛夈€傝В鏋愬悗鐨勫璞″涓嬫墍绀猴細{'./relative/path':1}銆傝繖鏄洜涓烘垜浠殑妯″潡琚浆璇戜负浣跨敤鐩稿璺緞璋冪敤require()銆傚湪璋冪敤杩欎釜鍑芥暟鐨勬椂鍊欙紝鎴戜滑搴旇鑳藉鐭ラ亾渚濊禆鍥句腑鐨勫摢涓ā鍧楀搴旂殑鏄偅涓ā鍧楃殑鐩稿璺緞銆傛帹鑽愶細闃竴宄板厛鐢熺殑娴忚鍣ㄥ姞杞紺ommonJS妯″潡鐨勫師鐞嗕笌瀹炵幇銆傛帴涓嬫潵锛屽垱寤轰竴涓狪IFE鑷墽琛屽嚱鏁般€傞櫎姝や箣澶栵紝鍒涘缓涓€涓猺equire()鍑芥暟锛氬畠鑾峰彇涓€涓ā鍧桰D骞跺湪鎴戜滑涔嬪墠鏋勫缓鐨勬ā鍧楀璞′腑鏌ユ壘瀹冦€俧unctionbundle(graph){//...constresult=`(function(modules){functionrequire(id){const[fn,mapping]=modules[id];functionlocalRequire(name){returnrequire(mapping[name]);}constmodule={exports:{}};fn(localRequire,module,module.exports);returnmodule.exports;}require(0);})({${modules}})`//杩斿洖鏈€缁堢粨鏋渞eturnresult}閫氳繃瑙f瀯const[fn,mapping]=modules[id]寰楀埌鎴戜滑鐨勫寘瑁呭嚱鏁板拰鏄犲皠瀵硅薄銆傛垜浠ā鍧楃殑浠g爜浣跨敤鐩稿鏂囦欢璺緞鑰屼笉鏄ā鍧桰D璋冪敤require()銆備絾鏄垜浠殑require鍑芥暟鎺ユ敹鍒颁竴涓ā鍧桰D銆傛澶栵紝涓や釜妯″潡鍙兘require()鐩稿悓鐨勭浉瀵硅矾寰勶紝浣嗕唬琛ㄤ袱涓笉鍚岀殑妯″潡銆備负浜嗚В鍐宠繖涓棶棰橈紝鎴戜滑鍒涘缓浜嗕竴涓柊鐨勪笓鐢╮equire鍑芥暟渚涙ā鍧楀湪闇€瑕佹椂浣跨敤銆傚畠灏嗙壒瀹氫簬璇ユā鍧楋紝骞朵笖鐭ラ亾浣跨敤妯″潡鐨勬槧灏勫璞″皢鍏剁浉瀵硅矾寰勮浆鎹负鈥嬧€婭D銆傛槧灏勫璞″氨鏄繖鏍峰仛鐨勶紝瀹冩槸鐗瑰畾妯″潡鐨勭浉瀵硅矾寰勫拰妯″潡ID涔嬮棿鐨勬槧灏勩€傛渶鍚庯紝浣跨敤CommonJS锛屽綋闇€瑕佸鍑烘ā鍧楁椂锛屽畠鍙互閫氳繃鏀瑰彉瀵煎嚭瀵硅薄鏉ユ毚闇叉ā鍧楃殑鍊笺€俽equire鍑芥暟鏈€缁堣繑鍥炲鍑哄璞°€傛偍鍙互鍒涘缓涓€涓枃浠舵潵淇濆瓨鎵撳寘鍚庣殑鍐呭锛屽苟灏嗚繖涓寘瀵煎叆鍒伴〉闈腑銆俢onstgraph=createGraph('./example/entry.js')constresult=bundle(graph)fs.writeFile('./dist/main.js',result,(err)=>{if(err)鎶涘嚭閿欒process.stdout.write('鍒涘缓鎴愬姛锛?)})鏌ョ湅绀轰緥
