# shimming (全局模块 例如 jquery, loadsh)
webpack 编译器(compiler)能够识别遵循 ES2015 模块语法、CommonJS 或 AMD 规范编写的模块。然而,一些第三方的库(library)可能会引用一些全局依赖(例如 jQuery 中的 $)。这些库也可能创建一些需要被导出的全局变量。这些“不符合规范的模块”就是 shimming 发挥作用的地方。
# 1. 全局变量
# - webpack.config.js
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.ProvidePlugin({
_: 'lodash'
})
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们还可以使用 ProvidePlugin 暴露某个模块中单个导出值,只需通过一个“数组路径”进行配置(例如 [module, child, ...children?])。所以,让我们做如下设想,无论 join 方法在何处调用,我们都只会得到的是 lodash 中提供的 join 方法。
# -webpack.config.js
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.ProvidePlugin({
join: ['lodash', 'join']
})
]
}
// 这样就能很好的与 tree shaking 配合,将 lodash 库中的其他没用到的部分去除。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2. polifill
# - 作用
# 解释一:
Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转码。 举例来说,ES6 在 Array 对象上新增了 Array.from 方法。Babel 就不会转码这个方法。如果想让这个方法运行,必须使用 babel-polyfill,为当前环境提供一个垫片。
# 解释二:
提示:polyfill 指的是“用于实现浏览器不支持原生功能的代码”,比如,现代浏览器应该支持 fetch 函数,对于不支持的浏览器,网页中引入对应 fetch 的 polyfill 后,这个 polyfill 就给全局的 window 对象上增加一个 fetch 函数,让这个网页中的 JavaScript 可以直接使用 fetch 函数了,就好像浏览器本来就支持 fetch 一样。在这个链接上 https://github.com/github/fetch 可以找到 fetch polyfill 的一个实现。
# - babel-polyfill 用正确的姿势安装之后,引用方式有三种:
require("babel-polyfill")
import "babel-polyfill"
module.exports = { entry: ["babel-polyfill", "./app/js"] }
← 生产环境构建 tree shaking →