webpack 配置不同环境变量

2019-03-07  本文已影响0人  钱英俊真英俊

根据不同的命令引用不同环境下代码进行打包
e.g: npm run build_dev -> 测试环境打包
npm run build_prod -> 生产环境打包

0.原理

1. 安装cross-env

{
  "scripts": {
    "build": "cross-env NODE_ENV=production node build/build.js"
  }
}

2. 配置不同环境下的脚本命令

"scripts": {
    "build_dev": "cross-env NODE_ENV=develpment node build/build.js",
    "build_prod": "cross-env NODE_ENV=production node build/build.js"
  }

3. 先看看webpack 的默认配置

process.env.NODE_ENV = 'production'
const spinner = ora(`building for procuction...`)

改为:(这里修改的是打包时控台的环境提示)
if (!process.env.NODE_ENV) {
  process.env.NODE_ENV = 'production'
}
const spinner = ora(`building for ${process.env.NODE_ENV}...`)
 plugins: [
    new webpack.DefinePlugin({
      'process.env': require('../config/dev.env')
    })
]
const env = require('../config/prod.env')

  plugins: [
    new webpack.DefinePlugin({
      'process.env': env
    })
]

4.根据NODE_ENV设置buildenv

let env = require('../config/prod.env')
if(process.env.NODE_ENV === 'development') {
  env = require('../config/dev.env')
} else if (process.env.NODE_ENV === 'production') {
  env = require('../config/prod.env')
}

plugins: [
    new webpack.DefinePlugin({
      'process.env': env
    })
]

5. 差异化配置


踩坑1

需要设置静态资源的路径,然后在config/index中设置

build: {
    assetsPublicPath: './'
}

并不能在development环境中打包出正确的路径

const webpackConfig = merge(baseWebpackConfig, {
  mode: 'production',
  output: {
    path: config.build.assetsRoot,
    filename: utils.assetsPath('js/[name].[chunkhash:8].js'),
    chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js')
  }

并没有publicPath的配置

base中的配置是:

output: {
   path: config.build.assetsRoot,
   filename: '[name].js',
   publicPath:
     process.env.NODE_ENV === 'production'
       ? config.build.assetsPublicPath
       : config.dev.assetsPublicPath
 }

如果环境不是production,使用webpack.dev.conf.js的配置
所以需要在webpack.prod中覆盖掉publicPath

  output: {
    path: config.build.assetsRoot,
    filename: utils.assetsPath('js/[name].[chunkhash:8].js'),
    chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js'),
    publicPath: './'
  }
上一篇 下一篇

猜你喜欢

热点阅读