webpack编译以后的结果,就是一个普普通通的函数

    手写编译函数

    a.js

    1. console.log('module a');
    2. module.exports='a';

    index.js

    1. console.log('index module');
    2. var a=require('./a')b
    3. conosle.log(a);
    1. //合并两个模块
    2. // ./src/a.js
    3. // ./src/index.js
    4. (function (modules) {
    5. var moduleExports = {}; //用于缓存模块的导出结果
    6. //require函数相当于是运行一个模块,得到模块导出结果
    7. function __webpack_require(moduleId) { //moduleId就是模块的路径
    8. if (moduleExports[moduleId]) {
    9. //检查是否有缓存
    10. return moduleExports[moduleId];
    11. }
    12. var func = modules[moduleId]; //得到该模块对应的函数
    13. var module = {
    14. exports: {}
    15. }
    16. func(module, module.exports, __webpack_require); //运行模块
    17. var result = module.exports; //得到模块导出的结果
    18. moduleExports[moduleId] = result; //缓存起来
    19. return result;
    20. }
    21. //执行入口模块
    22. return __webpack_require("./src/index.js"); //require函数相当于是运行一个模块,得到模块导出结果
    23. })({ //该对象保存了所有的模块,以及模块对应的代码
    24. "./src/a.js": function (module, exports) {
    25. eval("console.log(\"module a\")\nmodule.exports = \"a\";\n //# sourceURL=webpack:///./src/a.js")
    26. },
    27. "./src/index.js": function (module, exports, __webpack_require) {
    28. eval("console.log(\"index module\")\nvar a = __webpack_require(\"./src/a.js\")\na.abc();\nconsole.log(a)\n //# sourceURL=webpack:///./src/index.js")
    29. }
    30. });

    为什么代码要放在eval里面?

    • 因为浏览器里面运行的是合并后的代码,在如果代码报错,很难找到是那个模块出现了错误
    • 浏览器支持``”console.log(\”module a\”)\nmodule.exports = \”a\”;\n //# sourceURL=webpack:///./src/a.js”```这样的调试语法,可以指定出现错误的模块地址

    学习可以很轻松

    • 重过程,轻目标
    • 重大局,轻细节
    • 重基础,轻上层
    • 重实践,轻理论