1️⃣ 分析编译结果使用两个 a.js 模块和 index.js 模块
分析编译结果使用 CommonJS 模块化语法
1️⃣ 模拟 webpack 编译结果代码
// 合并两个模块// - ./src/a.js// - ./src/index.js(function (modules) {var moduleExport = {}; // 用户缓存模块到导出结果function __webpack_require(moduleId) { // moduleId 就是模块路径if (moduleExport[moduleId]) {// 检查是否有缓存return moduleExport[moduleId]}var fun = modules[moduleId];var module = {export: {}};fun(module, module.exports, __webpack_require); // 运行模块var result = module.exports; // 得到模块的导出结果moduleExport[moduleId] = result;return result;};// 执行入口模块__webpack_require('./src/index.js') // require 函数相当于是运行一个模块, 的到模块导出的结果})({// 该对象保存了所有的模块, 以及模块对应的代码"./src/a.js": function (module, exports) {module.exports = function () {console.log('模块-A');}// webpack 的编译是放在 eval 中的// eval("module.exports = function () {\r\n console.log('模块-A');\r\n}\n\n//# sourceURL=webpack:///./src/a.js?");},"./src/index.js": function (module, exports, __webpack_require) {var a = __webpack_require("./src/a.js")console.log(a());console.log('模块-Index');// webpack 的编译是放在 eval 中的// eval("var a = __webpack_require__(/*! ./a */ \"./src/a.js\");\r\nconsole.log(a());\r\nconsole.log('模块-Index');\r\n\n\n//# sourceURL=webpack:///./src/index.js?");}})
1️⃣ webpack 编译结果代码
以下代码已经删减一些兼容其他模块化语法的代码
(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;}return __webpack_require__(__webpack_require__.s = "./src/index.js");})({"./src/a.js": (function (module, exports) {eval("module.exports = function () {\r\n console.log('模块-A');\r\n}\n\n//# sourceURL=webpack:///./src/a.js?");}),"./src/index.js": (function (module, exports, __webpack_require__) {eval("var a = __webpack_require__(/*! ./a */ \"./src/a.js\")\r\nconsole.log(a());\r\nconsole.log('模块-Index');\r\n\n\n//# sourceURL=webpack:///./src/index.js?");})});
1️⃣ webpack 中将代码放在 eval() 函数中执行的用意
将编译的代码写在 eval 中执行是为了精确报错信息 , 以下代码均以上部代码举例
2️⃣ 如果不写在 eval 中报错信息
2️⃣ 写在 eval 中的报错信息
浏览器会将 eval 函数中的内容当做一个独立的模块执行, 所以将代码写在 eval 函数中后 , 报错时只会显示报错的模块
2️⃣ eval 函数的末尾可以指定报错的文件名更容易找到报错的位置

上图中黄色框选中的内容是指定报错文件名的方式

