1、使用场景
1.1 将一些第三方库作为全局依赖,例如jquery中的$, lodash中的_
1.2 使用polyfill扩展浏览器能力,来支持更多的语法。
2、预置全局依赖
例如我们要引入lodash-es,我们需要使用到webpack的ProvidePlugin()。在webpack.config,js中设置:
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
_:'lodash-es',
join: ['lodash-es', 'join']
}),
]
}
这里我们可以将整个lodash-es定义为-
, 将其join()定义为join
。这样在代码编译过程中,遇到- 或者 join就回去使用lodash-es。
不建议使用全局依赖。使用全局依赖后,bundle中会整个引入第三方库,无法优化bundle打包方式。而且前端的模块化开发要求模块之间彼此隔离,不依赖于全局变量。
3、全局export
将某些不支持模块化规范的模块所声明的全局变量导出。使用exports-loader。
npm install exports-loader --save-dev
webpack中配置
module.exports = {
module: {
rules: [
{
test: path.resolve(__dirname, 'src/globals.js'),
use: "exports-loader?file,parse=helpers.parse"
},
],
},
}
这里使用exports-loader指定/src/globals.js,将file导出为file,helpers.parse导出为parse。
globals.js
var file = 'blah.txt'
var helpers = {
test: () => { console.log('test') },
parse: () => { console.log('parse') }
}
index.js
import { file, parse } from './globals.js'
function components() {
var dom = document.createElement('p');
dom.innerHTML = _.join(['123', 'webpack'], ' ');
var bar = document.createElement('br');
dom.appendChild(bar);
console.log(file);
parse();
return dom;
}
document.body.appendChild(components());
上面demo可以看到,globals.js是不符合模块化规范的,只是定义了几个全局变量,正常情况下无法在index.js中使用import()。
通过exports-loader将globals.js导出并声明,这样就可以实现在全局内引用。
4、babel-polyfill
babel默认只转换新的js语法,但是不转换新的API,比如Map、Set、Promise,以及一些定义在全局对象上的方法,比如Array.from。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。
polyfill指的是"用于实现浏览器不支持原生功能的代码"。比如对于不支持fetch函数的浏览器,需要在网页引入对应fetch的polyfill。然后这个polyfill就给window对象添加了一个fetch函数。
npm install babel-polyfill --save
这里使用 --save而不是--save-dev,因为我们需要babel-polyfill在源代码之前运行,需要它成为一个dependencies,而不是一个devDependencies。
然后在index.js最上面引入
import 'babel-polyfill'
对于fetch
npm install --save whatwg-fetch
import 'babel-polyfill';
import 'whatwg-fetch';
shim/polyfill必须运行于所有其他代码之前,而且需要同步加载。下载第三方包是需要--save 而不是 --save-dev