webpack打包

背景

在我们项目开发中,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

总结

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容