公司项目使用webpack+gitlab,打包发布采用Jenkins自动化部署。天天都会发布多个版本,有时遇到问题须要知道前端包的版本信息。因为项目是从零开始,并无此功能。
因此本文介绍如何编写webpack插件,用于打包时自动记录信息。姑且称此插件为RecordBuildInfoPlugin
。前端
很简单,只须要3步,便可实现。webpack
在build
文件夹下新建文件record-build-info-plugin.js
,内容以下:git
const childProcess = require('child_process') const os = require('os') const fs = require('fs') const VERSION_FILE_PATH = 'dist/static/build-info.json' class RecordBuildInfoPlugin { constructor () { this.buildInfo = this.getBuildInfo() } getBuildInfo () { const commit = childProcess.execSync('git show -s --format=%H').toString().trim() const commitDateObj = new Date(childProcess.execSync(`git show -s --format=%cd`).toString()) const commitDateTime = commitDateObj.toLocaleDateString() + ' ' + commitDateObj.toLocaleTimeString() const now = new Date() const buildDateTime = now.toLocaleDateString() + ' ' + now.toLocaleTimeString() const ipAddress = getIPAddress() return { commit, commitDateTime, buildDateTime, ipAddress } } saveBuildInfo () { fs.writeFileSync(VERSION_FILE_PATH, JSON.stringify(this.buildInfo)) } apply (compiler) { if (compiler && compiler.hooks && compiler.hooks.done && compiler.hooks.done.tap) { // webpack 4.x compiler.hooks.done.tap('RecordBuildInfoPlugin', () => { this.saveBuildInfo() }) } else if (compiler && compiler.plugin) { // webpack 3.x compiler.plugin('done', () => { this.saveBuildInfo() }) } else { console.error('RecordBuildInfoPlugin Error') } } } function getIPAddress () { var interfaces = os.networkInterfaces() let ipArr = [] for (let devName in interfaces) { let iface = interfaces[devName] for (let i = 0; i < iface.length; i++) { let alias = iface[i] if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) { ipArr.push(alias.address) } } } return (ipArr.length ? ipArr : 'Fail Get IP') } module.exports = RecordBuildInfoPlugin
webpack.prod.conf.js
文件中引用这个pluginconst RecordBuildInfoPlugin = require('./record-build-info-plugin') const webpackConfig = merge(baseWebpackConfig, { plugins: [ // 在末尾处引用 new RecordBuildInfoPlugin() ] })
npm run build
在dist/static
下会多出json文件,记录打包信息。web
apply
方法,在apply
方法中去实现本身想作的事情。