Open Hibop opened 6 years ago
附上大神的webpack模块化原理三连,搞懂这些,妈妈再也不用担心不理解模块化了
webpack模块化原理-commonjs: https://segmentfault.com/a/1190000010349749; webpack模块化原理-ES module: https://segmentfault.com/a/1190000010955254 webpack模块化原理-Code Splitting: https://segmentfault.com/a/1190000010349749
关于webpack.DllPlugin({})使用: https://github.com/superpig/blog/issues/6
一个react全家桶强依赖vender包括: ['lodash', 'whatwg-fetch', 'react', 'react-dom', 'react-router', 'redux', 'react-redux', 'redux-thunk', 'redux-promise-middleware', 'immutable', 'redux-immutable', 'react-intl', 'core-js', 'tslib'] 这些包需要用DllPlugin先build出来可以充分利用浏览器缓存;
[antd, codemirror, chartjs] 等包并不是每个页面都需要,或者有些只是用其中一部分,所以我们可以做按需加载来 加载这些三方件
Webpack 入门指迷 : https://segmentfault.com/a/1190000002551952
模块化规范分类:
commonjs同步加载:代表nodejs,由于node后台异步操作IO很快,所以同步加载具有很好优势。 require/module.exports
ADM异步加载:requirejs
es6 Module import&&export
// 错误语法 export 1; var a = 100; export a; // 不能解构{100: 100}
【天坑】 export default fn 如果在router中require引入时必须:require(./dir/src...).default, 否则模块报错 因此在实际使用过程中定好标准:webpack使用require模块引入,而项目业务代码统一es6
模块化实现原理——IIFE(立即执行函数)
因为浏览器本身不支持模块化,那么webpack和require等模块化工具就用函数作用域来hack模块化的效果。
整个打包生成的代码是一个IIFE(立即执行函数)。函数参数是我们写的各个模块组成的数组,只不过我们的代码,被webpack包装在了一个函数的内部,也就是说我们的模块,在这里就是一个函数。
在debug node代码时,你会发现一样的hack方式,node中的模块也是函数,跟模块相关的参数exports、require,或者其他参数filename和dirname等都是通过函数传值作为模块中的变量,模块与外部模块的访问就是通过这些参数进行的,当然这对开发者来说是透明的。
同样的方式,webpack也控制了模块的module、exports和require,那么我们就看看webpack是如何实现这些功能的。
webpack模块化代码生成分析:
整个打包生成的代码是一个IIFE(立即执行函数)。函数参数是我们写的各个模块组成的数组,只不过我们的代码,被webpack包装在了一个函数的内部,也就是说我们的模块,在这里就是一个函数。
初始化函数
在执行模块函数之前,IIFE函数体内实现需要函数参数的初始化:
模块函数
对于模块化函数一般会有三个参数:
webpack的模块缓存:
在webpack中通过require加载模块,我们看到初始初始化时有installedModules,这是处理模块缓存问题 webpack管理着这些模块的缓存,如果一个模块被require多次,那么只会有一次加载过程,而返回的是缓存的内容,这也是commonjs的规范。
模块化规范历史
http://www.cnblogs.com/lvdabao/p/js-modules-develop.html