在什么背景下?
我当时正在使用 webpack 3.8.1,运行 webpack build 后得到了 main.[chunkhash:8].js。
那时,我的 package.json 数据被包含在了 main.xxxx.js 文件中。
当我将其部署到服务中时,这引发了安全问题。
实际上,我使用了私有 npm 仓库中的私有 npm 模块。
就在这时,有人阅读了我的 main.js 文件并获取了 package.json 的数据。
之后,他在公共 npm 仓库中创建了一个与我在 package.json 中使用的私有模块同名的模块,并将其上传。
他上传了从 0.0.1 到 9.9.9 的所有版本。
正因为如此,我的构建服务器在 Jenkins 构建过程中会优先读取公共 npm 数据,导致每次构建都失败。
如何解决?
我在我的日志 HOC jsx 文件中发现了从 package.json 导入 {version} 的代码,如下所示:
import {version} from '../package.json'
当 webpack 以生产模式构建时,所有 package.json 的数据都被打包进了 main.xxxx.js 中。
于是,我删除了这段代码。
我改用 webpack.DefinePlugin,它可以在构建 webpack 时使指定的数据作为全局变量可用。
当前的服务版本被保存在一个隔离的全局变量中,当实际使用时从该变量中读取 package.json 的版本信息。
webpack.config.js
const defined = {'process.package': { VERSION:JSON.stringify(packageConfig.version)}}
module.exports = {
...
plugins : [
new webpack.DefinePlugin(defined),
...
],
...
log.hoc.jsx
const logInfo = { version: process.package.VERSION, ... }
结论
当我结合 babel 使用 webpack 时,我设置了 presets modules:false。
所以我认为当我使用类似 import {version} from 'package.json' 的代码时,它会被 Tree-shaking 优化掉,因此只有版本号会出现在 main.xxxx.js 捆绑文件中。但事实并非如此。
现在我知道对于 JSON 文件,import 的工作方式与 require 类似,所以它不支持 Tree-shaking。
回想起来,这是一次令人羞愧的经历。
求知若渴,虚心若愚 (Stay Hungry, Stay Foolish)