美文网首页
webpack 配置不同环境变量

webpack 配置不同环境变量

作者: 钱英俊真英俊 | 来源:发表于2019-03-07 17:35 被阅读0次

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

    0.原理

    • 环境变量(environment variables)不属于NODE范畴,是操作系统用于设定执行环境的参数,会在程序运行时传递给应用程序。
    • node 的process.env属性返回包含用户环境的对象
    • process.env.env_name // 获取对应环境变量的值

    1. 安装cross-env

    • 作用: 使脚本可以跨平台设置和使用环境变量
    • 原因: Windows 不支持 NODE_ENV=development的设置方式
    • 安装:npm install -D 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 的默认配置

    • webpack已经默认配置了dev 和 prod
    • build/build.js
    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}...`)
    
    • build/webpack.dev.conf.js 的默认配置(不需要修改)
     plugins: [
        new webpack.DefinePlugin({
          'process.env': require('../config/dev.env')
        })
    ]
    
    • build/webpack.prod.conf.js的默认配置(后面要修改)
    const env = require('../config/prod.env')
    
      plugins: [
        new webpack.DefinePlugin({
          'process.env': env
        })
    ]
    
    • 即:使用DefinePlugin创建一个在编译时可以配置的全局变量,使其可以在项目中以及编译时使用

    4.根据NODE_ENV设置buildenv

    • build/build.js 会执行build/webpack.prod.js,所以打包的时候是在这里根据process.env.NODE_ENV的不同设置不同的process.env

    • build/webpack.prod.conf.js需要修改的地方

    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. 差异化配置

    • 这时候只需要在 config/dev.env 以及config/prod.env中写配置就可以引用了

    踩坑1

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

    build: {
        assetsPublicPath: './'
    }
    

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

    • 原因
      webpack.prod.conf.js中是merge了webpack.base.conf.js
      prod中的配置是:
    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: './'
      }
    

    相关文章

      网友评论

          本文标题:webpack 配置不同环境变量

          本文链接:https://www.haomeiwen.com/subject/hnvcpqtx.html