模块化主要是用来抽离公共代码,隔离做用域,避免变量冲突等。将一个复杂的系统分解为多个模块以方便编码。css
会讲述如下内容vue
同步加载node
CommonJS API是以在浏览器环境以外构建 JS 生态系统为目标而产生的项目webpack
若是没有写后缀名Node会尝试为文件名添加.js、.json、.node后再搜索。git
.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。github
异步加载(对象)web
"Asynchronous Module Definition"(异步模块定义),是由RequireJS提出的ajax
AMD核心实现json
function require (url, callback) {
// url能够换成List,而后遍历;
var $script = document.createElement('script');
$script.src = url;
// 利用onload回调,实现依赖加载
$script.onload = function (e) {
// 省略callback 检测
callback();
}
document.body.appendChild($script);
}
复制代码
按需加载浏览器
由玉伯提出的(seajs),按需解析加载模块(代价挺大的),须要使用把模块变为字符串解析一遍才知道依赖了那些模块
CMD核心实现
// ajax,怕忘了原生ajax怎么写。顺手写一个
function myAjax (url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('get', url);
xhr.send();
xhr.onreadystatechange = function () {
if (request.readyState === 4) {
if (request.status === 200) {
return callback(request.responseText);
} else {
// 省略...
}
} else {
// 省略...
}
}
}
// 实现
function require(url) {
myAjax(url, function(res) {
// 此时 res 的对应JS的 String形式
// 解析 省略
// 执行
eval(res);
});
}
复制代码
兼容AMD,CommonJS 模块化语法。
UMD源码解析
(function (root, factory) {
// 判断是否支持AMD(define是否存在)
if (typeof define === 'function' && define.amd) {
define(['b'], factory);
// 判断是否支持NodeJS模块格式(exports是否存在)
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('b'));
// 前两个都不存在,则将模块公开到全局(window或global)
} else {
root.returnExports = factory(root.b);
}
} (this, function (b) {
// ...
}));
复制代码
加载引用
import()
使用时加载import会被编译成 require/exports (CommonJS规范)
1. 直接引入
import xxx.js
或者import xxx.css
会像添加<script>
和<link>
标签同样注入到全局中去
2. commonjs同步语法
webpack会将require('abc.js')
打包进引用它的文件中。以对象的形式获取。
3. commonjs异步加载
webpack(require.ensure):webpack 2.x 版本中的代码分割。
在commonjs中有一个Modules/Async/A规范,里面定义了require.ensure
语法。webpack实现了它,做用是能够在打包的时候进行代码分片,并异步加载分片后的代码。
此时list.js会被打包成一个单独的chunk文件。像这样:1.d6f343b727f5923508bf.js
例如:vue路由懒加载const Foo = () => import('./Foo.vue')
manifest
manifest文件是最早加载的,manifest是在vendor的基础上,再抽取出要常常变更的部分,经过manifest.js文件来管理bundle文件的运行和加载。(好比关于异步加载js模块部分的内容)
webpack v4.6.0+ 添加了预取和预加载的支持
import(/* webpackPrefetch: true */ 'LoginModal');
会生成 <link rel="prefetch" href="login-modal-chunk.js"> 并追加到页面头部
复制代码