CommonJS規(guī)范

研究了一下CommonJS規(guī)范,用webpack打包之后,得到源碼進(jìn)行分析躲查,只要分析webpack_require與打包的過程它浅。webpack打包的命令(webpack --devtool none --mode development --target node ./src/index.js --output-path='./CommonJS'

  • webpack的用法自行百度,我只展示打包后的代碼(把注釋刪掉了)
源碼
// core.js
console.log('core js')
exports.name = 'Jack'
exports.old = '18'
exports.play = function() {
  console.log('play game')
}

module.exports = function() {
  console.log('module')
}
// index.js
const Core = require('./core.js')
console.log(Core.name)
console.log(Core.old)
console.log(Core.paly)
console.log(Core)
(function (modules) {
  var installedModules = {};
  function __webpack_require__(moduleId) {
    if (installedModules[moduleId]) {
      return installedModules[moduleId].exports;
    }
    var module = installedModules[moduleId] = {
      i: moduleId,
      l: false,
      exports: {}
    };
    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
    module.l = true;
    return module.exports;
  }
  __webpack_require__.m = modules;
  __webpack_require__.c = installedModules;

  __webpack_require__.d = function (exports, name, getter) {
    if (!__webpack_require__.o(exports, name)) {
      Object.defineProperty(exports, name, { enumerable: true, get: getter });
    }
  };
  __webpack_require__.r = function (exports) {
    if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
      Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
    }
    Object.defineProperty(exports, '__esModule', { value: true });
  };
  __webpack_require__.t = function (value, mode) {
    if (mode & 1) value = __webpack_require__(value);
    if (mode & 8) return value;
    if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
    var ns = Object.create(null);
    __webpack_require__.r(ns);
    Object.defineProperty(ns, 'default', { enumerable: true, value: value });
    if (mode & 2 && typeof value != 'string') for (var key in value) __webpack_require__.d(ns, key, function (key) { return value[key]; }.bind(null, key));
    return ns;
  };
  __webpack_require__.n = function (module) {
    var getter = module && module.__esModule ?
      function getDefault() { return module['default']; } :
      function getModuleExports() { return module; };
    __webpack_require__.d(getter, 'a', getter);
    return getter;
  };
  __webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  __webpack_require__.p = "";
  return __webpack_require__(__webpack_require__.s = "./src/index.js");
})({

  "./src/core.js": (function (module, exports) {

    console.log('core js')

    exports.name = 'Jack'
    exports.old = '18'
    exports.play = function () {
      console.log('play game')
    }

    module.exports = function () {
      console.log('module')
    }

  }),
  "./src/index.js": (function (module, exports, __webpack_require__) {
    const Core = __webpack_require__(/*! ./core.js */ "./src/core.js")
    console.log(Core.name)
    console.log(Core.old)
    console.log(Core.paly)
    console.log(Core)
  })
});

分析一下結(jié)構(gòu)

1镣煮、 './src/core.js'與'./src/index.js'是兩個腳本路徑姐霍,每個參數(shù)指向一個函數(shù),每個模塊相當(dāng)于一個作用域,js使用函數(shù)創(chuàng)建作用域镊折。
2胯府、打包之后就是個自執(zhí)行函數(shù),參數(shù)就是每個模塊的對應(yīng)的函數(shù)

(function (modules) {})({模塊1恨胚, 模塊2骂因,...})

3、installedModules 儲存每個模塊初始化赃泡,判斷是否已經(jīng)初始化侣签,在調(diào)用入口文件
4、可以看出來./src/core.jsmodule.exports是被重新賦值急迂,而./src/core.js內(nèi)部的module.exports內(nèi)被保留在函數(shù)內(nèi)部

var module = installedModules[moduleId] = {
  i: moduleId,
  l: false,
  exports: {} // 重新賦值
};
return module.exports// 返回結(jié)果
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

關(guān)于webpack打包的原理 AST preset-env loader plugins entry output等有興趣可以了解一下影所,我只是簡單介紹CommonJS規(guī)范引入nodeJS是怎么引用的,以及exports的作用域

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僚碎,一起剝皮案震驚了整個濱河市猴娩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勺阐,老刑警劉巖卷中,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渊抽,居然都是意外死亡蟆豫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門懒闷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十减,“玉大人,你說我怎么就攤上這事愤估“锉伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵玩焰,是天一觀的道長由驹。 經(jīng)常有香客問我,道長昔园,這世上最難降的妖魔是什么蔓榄? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮默刚,結(jié)果婚禮上甥郑,老公的妹妹穿的比我還像新娘。我一直安慰自己羡棵,他們只是感情好壹若,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般店展。 火紅的嫁衣襯著肌膚如雪养篓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天赂蕴,我揣著相機(jī)與錄音柳弄,去河邊找鬼。 笑死概说,一個胖子當(dāng)著我的面吹牛碧注,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糖赔,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萍丐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了放典?” 一聲冷哼從身側(cè)響起逝变,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奋构,沒想到半個月后壳影,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弥臼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年宴咧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片径缅。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掺栅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芥驳,到底是詐尸還是另有隱情柿冲,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布兆旬,位于F島的核電站,受9級特大地震影響怎栽,放射性物質(zhì)發(fā)生泄漏丽猬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一熏瞄、第九天 我趴在偏房一處隱蔽的房頂上張望脚祟。 院中可真熱鬧,春花似錦强饮、人聲如沸由桌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽行您。三九已至铭乾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娃循,已是汗流浹背炕檩。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捌斧,地道東北人笛质。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像捞蚂,于是被迫代替她去往敵國和親妇押。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354