<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      太上老俊

      webpack - minipack 打包原理

      code:https://github.com/ronami/minipack

      看了https://www.youtube.com/watch?v=Gc9-7PBqOC8總結一下

       

      工具和環境:

      node環境;

      依賴模塊:

        fs:文件讀取

        path:文件路徑處理

        babylon:ast樹的轉換(https://astexplorer.net/

        babel-traverse:遍歷ast數,查找所有依賴關系

        babel-core:用transformFromAst方法把ast數轉換為js代碼(此處的代碼為babel解析過后的代碼:https://babeljs.io/repl/,commonJs標準)

       

      總體流程是為:根據entry路口文件,用babylon轉換為ast樹,從中查找所有的依賴管理,然后遍歷依賴關系圖,再把所有依賴的代碼整合輸出。

       

      最后整合輸出的代碼如下:

      (function(modules) {
            function require(id) {
              const [fn, mapping] = modules[id];
      
              function localRequire(name) {
                return require(mapping[name]);
              }
      
              const module = { exports : {} };
      
              fn(localRequire, module, module.exports);
      
              return module.exports;
            }
      
            require(0);
          })({0: [
            function (require, module, exports) {
              "use strict";
      
      var _message = require("./message.js");
      
      var _message2 = _interopRequireDefault(_message);
      
      function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
      
      console.log(_message2.default);
            },
            {"./message.js":1},
          ],1: [
            function (require, module, exports) {
              "use strict";
      
      Object.defineProperty(exports, "__esModule", {
        value: true
      });
      
      var _name = require("./name.js");
      
      exports.default = "hello " + _name.name + "!";
            },
            {"./name.js":2},
          ],2: [
            function (require, module, exports) {
              "use strict";
      
      Object.defineProperty(exports, "__esModule", {
        value: true
      });
      var name = exports.name = 'world';
            },
            {},
          ],})

       

      解析后大概流程如下:

      1、自執行函數(fun(...){})(params)

      2、fun代碼

      function fun1(modules) {// 接收modules對象
        function require(id) {
          const [fn, mapping] = modules[id];// 獲取對應模塊的 fn和依賴mapping
      
          function localRequire(name) { // 遞歸,請求所有依賴
            return require(mapping[name]);
          }
      
          const module = { exports : {} };
      
          fn(localRequire, module, module.exports);//執行函數,因為require傳入后,在fun方法體中會執行require方法請求依賴,故會先執行最底層的依賴。
      
          return module.exports;
        }
      
        require(0);
      }



      3、params

      {0: [
            function (require, module, exports) {
              "use strict";
      
      var _message = require("./message.js");
      
      var _message2 = _interopRequireDefault(_message);
      
      function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
      
      console.log(_message2.default);
            },
            {"./message.js":1},
          ],1: [
            function (require, module, exports) {
              "use strict";
      
      Object.defineProperty(exports, "__esModule", {
        value: true
      });
      
      var _name = require("./name.js");
      
      exports.default = "hello " + _name.name + "!";
            },
            {"./name.js":2},
          ],2: [
            function (require, module, exports) {
              "use strict";
      
      Object.defineProperty(exports, "__esModule", {
        value: true
      });
      var name = exports.name = 'world';
            },
            {},
          ],}

      // key為模塊的id,對應的value = [fun,mapping];
      // fun為一個函數,接收require,modle,exports,fun里的內容是經過babel-core轉換過的js代碼
      // mapping為依賴模塊的id

        

      當然,真正的打包還需要很多工作,如循環依賴、異常捕獲及提示等等。此為冰山一角

       

      posted on 2019-04-10 16:59  太上老俊  閱讀(770)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 嫩b人妻精品一区二区三区| 亚洲国产av无码精品无广告| 久爱无码精品免费视频在线观看| 国产一区二区三区色成人| 亚洲码和欧洲码一二三四| 少妇人妻偷人一区二区| 成人国产精品三上悠亚久久 | 亚洲精品国产中文字幕| 久本草在线中文字幕亚洲| 亚洲护士一区二区三区| 国产综合一区二区三区麻豆| 在线看免费无码的av天堂 | 日本无人区一区二区三区| 女同亚洲精品一区二区三| 四房播色综合久久婷婷| 国产精品无码不卡在线播放 | 国产一区二区一卡二卡| 伊人精品无码av一区二区三区 | 91孕妇精品一区二区三区| 精品亚洲欧美无人区乱码| 乌拉特后旗| 又大又粗又硬又爽黄毛少妇| 国产AV影片麻豆精品传媒| 尼木县| 无码人妻日韩一区日韩二区| 日韩深夜免费在线观看| 久久精品一区二区三区中文字幕| 亚洲国产精品成人综合色在| 五月丁香啪啪| 亚洲精品一区二区三区中文字幕| 大乳丰满人妻中文字幕日本| 亚洲欧美日韩愉拍自拍美利坚| 少妇高潮惨叫喷水在线观看| 97超级碰碰碰久久久久| 亚州中文字幕一区二区| 狠狠色丁香婷婷综合尤物| 一区二区三区四区激情视频| 少妇人妻偷人偷人精品| 午夜天堂一区人妻| 亚洲中文字幕无码久久2020| 欧美不卡无线在线一二三区观|