美文网首页
webpack打包

webpack打包

作者: Rotary | 来源:发表于2019-11-26 16:15 被阅读0次

背景

在我们项目开发中,vue-cli配置好的一些简单的打包命令往往都无法满足我们的需求。不同环境下的请求路径,api的版本,所在的平台等等。在这个情况下, 我们急需可以自定义去配置一些全局的参数提供项目中使用。这时候我们就想到了可以从打包命令下手,通过传递不同的参数,并且对这些参数处理之后挂载到全局,去解决我们的问题。我们在项目的的打包命令中做了很多次的修改优化和迭代,下面讲速一下我们最新打包命令配置的思路。

传参

打包命令时通过 -- 向下指向process.argv传参,我们是通过键名去匹配键值,提高配置的实用性,降低耦合,通用于各个项目中。eg: npm run serve -- --键名=键值

开启多个监听服务

使用插件concurrently(npm install concurrently --save) npm script命令同时开启多个监听服务 build-serve-concurrently.js

// 统一输出打包命令
const concurrently = require('concurrently')
let arr = process.argv.filter((itm, idx) => idx > 1)

let env = 'development' // 不传参数默认为dev环境
let cmd = '' // 运行命令
let platform = ['mp-weixin', 'mp-toutiao', 'mp-baidu', 'h5'] // 默认打包平台参数
let concurrentlyArr = []
let str = arr.join(' ')

arr.forEach((item) => {
  item = item.slice(2)
  let platArr = item.split('=')
  switch (platArr[0]) {
     case 'env':
      cmd = !platArr[1].includes('dev') && !platArr[1].includes('prod') ? cmd = `mode ${platArr[1]}` : ''
      env = platArr[1].includes('prod') ? 'production' : 'development'
      break
    // 平台配置命令
    case 'platform':
      let value = platArr[1].split(',')
      // 打包命令,打包platform传入的平台,可传多个用逗号隔开
      concurrentlyArr = value.map((child) => {
        return `cross-env NODE_ENV=${env} UNI_PLATFORM=${child} vue-cli-service ${cmd} uni-build --watch ${str}`
      })
    default:
      break
  }
})
 // 打包命令,默认打包四个平台
concurrentlyArr = !concurrentlyArr.length ? platform.map((child) => {
  return `cross-env NODE_ENV=${env} UNI_PLATFORM=${child} vue-cli-service ${cmd} uni-build --watch ${str}`
}) : concurrentlyArr

concurrently(concurrentlyArr)
环境(--env)

环境参数,常用值有 local本地,dev研发, release测试, prod线上正式 eg: --env=release

vue/cli3.0之后环境变量可以在本地文件中新建一个对应的.env.release(环境名称) 定义一个VUE_APP_ENV对应的环境参数,原框架中只有development和production环境,设置了VUE_APP_ENV打包命令时传入mode release 就会自动识别混淆入 process.env中,在.env.文件名 文件中还可以定义一些全局不需要变动的参数,可以直接通过process.env获取

平台(--platform)

我们的命令中配置了默认打包四个平台(百度mp-baidu,微信mp-weixin,头条mp-toutiao,h5),--platform=xxx可自定义打包指定的平台,可传入多个用,隔开,可以自由的切换自己想要并线打包的平台 eg: --platform=mp-weixin,mp-toutiao,更多平台参数可以查看

版本(--version)

在我们开发中,为了并线,小程序的发布,急需到多个版本的api进行支持,那么版本的配置对我们来说就显得尤为急需。默认状态下我们是选择打包无版本。版本可以通过键值自定义传入,既方便了我们开发时的各种场景,又可以避免固定化的参数配置的局限性 eg: --version=v1

自定义参数拓展

在配置文件中可以在命令中传入任意参数,传入的参数将会以全大写的方式挂载在全局,我们可以在开发时的任意位置直接获取到我们想要的参数。可以运用于sass多平台配置等业务场景中

比如版本 console.log(VERSION) --> 打印出 release

全局注入参数
vue/cli3.0以上

在vue.config.js文件中配置第三方插件全局注入参数 new webpack.DefinePlugin()

const webpack = require('webpack')
const VERSION_NAME = 'version' // 版本
let param = infoVersion(process.argv)
// 第三方插件全局注入参数
var definePlugin = new webpack.DefinePlugin(param)

module.exports = {
  css: {
    loaderOptions: {
      // 给 stylus-loader 传递选项
      stylus: {
        import: [
          '~@/design/variable.styl',
          '~@/design/mixin.styl'
        ]
      }
    }
  },
  configureWebpack: { // 第三方插件配置
    plugins: [
      definePlugin
    ]
  }
}

// 处理自定义参数
function infoVersion(arr, type) {
  let value = {}
  arr.forEach((item) => {
    item = item.slice(2).split('=')
    if (item.length > 1) {
      let str = item[0] === VERSION_NAME ? '/' + item[1] : item[1]
      value[item[0].toUpperCase()] = JSON.stringify(str)
    }
  })
  return value
}
vue/cli3.0以下

在build/webpack.base.conf.js文件中配置第三方插件全局注入参数 new webpack.DefinePlugin()

可通过获取参数传入的,process.argv

总结

框架的打包配置尽量降低与业务的耦合性,提高拓展性。尽可能保证输出的框架是一个架子,可以由不同的业务场景进行拓展,而不是跟着业务跑,当业务需求新增修改时框架将也会需要跟着大幅度的修改。 将会大大提高开发的成本。

相关文章

网友评论

      本文标题:webpack打包

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