zoukankan      html  css  js  c++  java
  • vue2+webpack怎样分环境打包

      今年有机会做了一个vue2的单页面应用的项目,从开发到上线经历了两个环境。测试环境以及正式环境我都是跑npm run build。这两个环境的变量当前是不一样的,每次打包都要去改变量,感觉有点小麻烦。后来参考同事的,他们项目里面分环境跑不同的命令,得到不同的包。例如测试环境npm run test ,正式环境 npm run build。

      需在文件config/prod.env.js配置  

    var obj={}
    const target = process.env.npm_lifecycle_event;
    if (target == 'test'){
      obj={
        NODE_ENV: '"production"',
        API_SANBOX:'"http://sandbox.gw.fdc.com.cn/router/rest"',
      }
    }else if(target=="pre"){
      obj={
        NODE_ENV: '"production"',
        API_SANBOX:'"http://pregw.fdc.com.cn/router/rest"'
      }
    }else{
      obj={
        NODE_ENV: '"production"',
        API_SANBOX:'"http://gw.fdc.com.cn/router/rest"'
      }
    }
    module.exports = obj;

    npm 提供一个npm_lifecycle_event变量,返回当前正在运行的脚本名称,比如pretesttestposttest等等。所以,可以利用这个变量,在同一个脚本文件里面,为不同的npm scripts命令编写代码。

    在package.json里面要添加相应的命令

    "scripts": {
    
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "lint": "eslint --ext .js,.vue src",
        "test": "node build/build.js",
        "pre": "node build/build.js",
        "build": "node build/build.js"
      }

    定义在config/prod.env.js里面的变量,可在js文件里通过process.env.XX获取到,例如你想要拿到API_ROOT_DICT的变量可通过process.env.API_ROOT_DICT得到

    生成环境中,若测试环境和预发布环境html和静态资源是放在一起的,而线上环境是分开的。静态资源如果放在http://static.fdc.com.cn/zt下,则需要在config>>index.js中修改build里

    assetsPublicPath的值
    assetsPublicPath:process.env.npm_lifecycle_event=='build'?'http://static.fdc.com.cn/':'/' 
     第二种方式 :
      将不同的环境变量放在不同的js里。开发环境的变量在dev.env里。生成环境内的测试环境、预发布、线上环境分别对应test.env.js   pre.env.js  prod.env.js里。以测试环境为例,
    'use strict'
    const merge = require('webpack-merge')
    const prodEnv = require('./prod.env')
    
    module.exports = merge(prodEnv, {
      NODE_ENV: '"production"',
      API_SANBOX:'"http://sandbox.gw.fdc.com.cn/router/rest"'
    })

    需配置config内的index.js 

    'use strict'
    // Template version: 1.3.1
    // see http://vuejs-templates.github.io/webpack for documentation.
    
    const path = require('path')
    const merge = require('webpack-merge')
    
    const environment = {
      test: {
        env: require('./test.env'),
        assetsPublicPath: '/',
        productionSourceMap: false
      },
      pre: {
        env: require('./pre.env'),
        assetsPublicPath: '/',
        productionSourceMap: false
      },
      build: {
        env: require('./prod.env'),
        assetsPublicPath: 'http://static.fdc.com.cn/map/', //对应线上静态资源目录
        productionSourceMap: true
      }
    }
    
    module.exports = {
      dev: {
    
        // Paths
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        proxyTable: {},
    
        // Various Dev Server settings
        host: '0.0.0.0', // can be overwritten by process.env.HOST
        port: 8686, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
        autoOpenBrowser: false,
        errorOverlay: true,
        notifyOnErrors: true,
        poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
    
        // Use Eslint Loader?
        // If true, your code will be linted during bundling and
        // linting errors and warnings will be shown in the console.
        useEslint: true,
        // If true, eslint errors and warnings will also be shown in the error overlay
        // in the browser.
        showEslintErrorsInOverlay: false,
    
        /**
         * Source Maps
         */
    
        // https://webpack.js.org/configuration/devtool/#development
        devtool: 'cheap-module-eval-source-map',
    
        // If you have problems debugging vue-files in devtools,
        // set this to false - it *may* help
        // https://vue-loader.vuejs.org/en/options.html#cachebusting
        cacheBusting: true,
    
        cssSourceMap: true
      },
    
      build: merge( {
        // Template for index.html
        index: path.resolve(__dirname, '../dist/index.html'),
    
        // Paths
        assetsRoot: path.resolve(__dirname, '../dist'),
        assetsSubDirectory: 'static',
        assetsPublicPath:'/' ,
    
        /**
         * Source Maps
         */
    
        productionSourceMap: true,
        // https://webpack.js.org/configuration/devtool/#production
        devtool: '#source-map',
    
        // Gzip off by default as many popular static hosts such as
        // Surge or Netlify already gzip all static assets for you.
        // Before setting to `true`, make sure to:
        // npm install --save-dev compression-webpack-plugin
        productionGzip: false,
        productionGzipExtensions: ['js', 'css'],
    
        // Run the build command with an extra argument to
        // View the bundle analyzer report after build finishes:
        // `npm run build --report`
        // Set to `true` or `false` to always turn it on or off
        bundleAnalyzerReport: process.env.npm_config_report
      },environment[process.env.npm_lifecycle_event])
    }

    修改的地方为

    然后将build里的webpack,prod.config内的js修改如下

    在package.json里script内设置如下

    "scripts": {
    
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "lint": "eslint --ext .js,.vue src",
        "test": "node build/build.js",
        "pre": "node build/build.js",
        "build": "node build/build.js"
      }
  • 相关阅读:
    AtCoder Regular Contest 077
    FWT模板
    hackerrank Alex对战Fedor
    hackerrank 训练军队
    hackerrank Diameter Minimization
    hackerrank Ticket
    java基础 布局管理器
    java基础 super 子类调用父类
    java基础 字符串 “==” 和 “equals” 比较
    java基础 作业(一)
  • 原文地址:https://www.cnblogs.com/nanacln/p/7028275.html
Copyright © 2011-2022 走看看