# 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'
    })
  ]
}
1
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 库中的其他没用到的部分去除。
1
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 用正确的姿势安装之后,引用方式有三种:

  1. require("babel-polyfill")

  2. import "babel-polyfill"

  3. module.exports = { entry: ["babel-polyfill", "./app/js"] }

Last Updated: 9/1/2021, 2:33:08 PM