webpack 裏的 import, exports 實現原理

在使用 webpack 對腳本進行打包, 在開發中, 每一個文件中都會使用 import 語句來導入一些功能,又會使用 export 語句導出一些功能,爲了研究 import 和 export 原理,研究了 webpack 打包後的代碼,其實原理也是很是簡單:webpack

webpack 對全部輸入文件都打包到一個文件中:web

在最終的輸出文件中,webpack 會定義一個 Object 對象,這個對象中放入了全部的輸入文件的內容, 以文件名爲 key, 文件內容(字符串)做爲值,如:函數

var modules= {};ui

modules['index'] = "源代碼";對象

modules['hello'] = '源代碼';開發

 

固然,webpack 會對源代碼進行必定的修改, 會把 export 語句修改成 exports.變量 = 值, 這種方法, exports 是一個參數, 大概是這樣子的:字符串

 

modules['index'] = (function(exports) {io

  // 代碼,放在一個私有域中。console

  // 經過 exports 對象,把須要公開的變量,函數,類公開出去。編譯

  exports.xx = xxx;

});

這就大概是一個源文件最終的結果,變成了一個函數,那麼這個 exports 究竟是個什麼對象?其實 exports 就是一個 Object 對象,裏面沒有任何其實內容,所有是函數中設置的內容,做用只是把對象傳遞到 import 語句:

先來看看 import 的語法: import xxx from 'filename'

import 語句, 最終大概會變成這樣:

var cmp1 = require('filename');

require 函數大概的實現:

function require(id) {

if(installedModules[id]) {

  return installedModules[id].exports; // 返回 exports 對象

}

var module = installedModules[id] = {
      i: moduleId,
      l: false,
      exports: {} // 定義 exports 對象
 };
 
modules[id](module.exports); // 把 exports 參數傳遞到函數中
return module.exports; // 最後返回
}
 
無論 import xxx 語句中的 xxx 怎麼設置, 最終都會變成一個變量,引用模塊的 exports 對象,而後經過這個變量來訪問變量,函數等:
import { a, b } from 'filename'
 
console.log(a);
console.log(b);
 
最終編譯的結果:
var cmp1 = require('filename');
console.log(cmp1.a);
console.log(cmp1.b);
 
最後, 文件傳統執行入口文件的代碼 require('index');
相關文章
相關標籤/搜索