WebPack shimming 全局变量
发布时间:2023-05-06 13:33:09 所属栏目:教程 来源:
导读:webpack 编译器(compiler)能够识别遵循 ES2015 模块语法、Commonjs 或 AMD 规范编写的模块。然而,一些第三方的库(library)可能会引用一些全局依赖(例如 jQuery 中的 $)。这些库也可能创建一些需要被导出的全局变量
webpack 编译器(compiler)能够识别遵循 ES2015 模块语法、Commonjs 或 AMD 规范编写的模块。然而,一些第三方的库(library)可能会引用一些全局依赖(例如 jQuery 中的 $)。这些库也可能创建一些需要被导出的全局变量。这些“不符合规范的模块”就是 shimming 发挥作用的地方。 我们不推荐使用全局的东西!在 webpack 背后的整个概念是让前端开发更加模块化。也就是说,需要编写具有良好的封闭性(well contained)、彼此隔离的模块,以及不要依赖于那些隐含的依赖模块。请只在必要的时候才使用本文所述的这些特性。 shimming 另外一个使用场景就是,当你希望 polyfill 浏览器功能以支持更多用户时。在这种情况下,你可能只想要将这些 polyfills 提供给到需要修补(patch)的浏览器(也就是实现按需加载)。 为了方便,本指南继续沿用起步中的代码示例。在继续之前,请确保你已经熟悉那些配置。 shimming 全局变量 让我们开始第一个 shimming 全局变量的用例。在此之前,我们先看看我们的项目: project webpack-demo |- package.json |- webpack.config.js |- /dist |- /src |- index.js |- /node_modules 还记得我们之前用过的 lodash 吗?出于演示的目的,让我们把这个模块作为我们应用程序中的一个全局变量。要实现这些,我们需要使用 ProvidePlugin 插件。 使用 ProvidePlugin 后,能够在通过 webpack 编译的每个模块中,通过访问一个变量来获取到 package 包。如果 webpack 知道这个变量在某个模块中被使用了,那么 webpack 将在最终 bundle 中引入我们给定的 package。让我们先移除 lodash 的 import 语句,并通过插件提供它: src/index.js - import _ from 'lodash'; - function component() { var element = document.createElement('div'); - // Lodash, Now imported by this script element.innerHTML = _.join(['Hello', 'webpack'], ' '); return element; } document.body.appendChild(component()); 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' + }) + ] }; 如果你遇到了至少一处用到 lodash 变量的模块实例,那请你将 lodash package 包引入进来,并将其提供给需要用到它的模块。 如果我们 run build,将会看到同样的输出: Hash: f450fa59fa951c68c416 Version: webpack 2.2.0 Time: 343ms Asset Size Chunks Chunk Names bundle.js 544 kB 0 [emitted] [big] main [0] ./~/lodash/lodash.js 540 kB {0} [built] [1] (webpack)/buildin/global.js 509 bytes {0} [built] [2] (webpack)/buildin/module.js 517 bytes {0} [built] [3] ./src/index.js 189 bytes {0} [built] 我们还可以使用 ProvidePlugin 暴露某个模块中单个导出值,只需通过一个“数组路径”进行配置(例如 [module, child, ...children?])。所以,让我们做如下设想,无论 join 方法在何处调用,我们都只会得到的是 lodash 中提供的 join 方法。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |