关于构建webpack构建工具 在vue框架中搭建多入口多环境的方法

因公司需求需要开发 一个 统筹型管理后台,多个项目一体的那种,所以想到了用vue-cli构建一个 多入口,多项目在同一个vue框架中的方法,不管是development 生产环境还是 product正式环境,都可以在同一个vue框架内部进行多个入口,多项目这种方式去开发无数个项目。

因为好久没有修改过 webpack的底层了,所以找到了之前看到的一个大佬写的地址,看了一下,还挺不错,就是一些地方,可能因为webpack更新有点影响,所以我做了一些局部修改

基于 vue-cli 2 实现,vue 支持多模块项目 这个是那个大佬的地址

其实是在 vue-cli的脚手架里面 的config文件下建立一个js文件,名字随意,为了表示尊重 我还是用的multi.conf.js

文件地址

下面是 这个文件 我这里的代码

let projects = ['projectA', 'projectB', 'projectC'];// 自定义项目 目录名 暂时放置了三个 如需使用可以 向后插入添加let path = require("path");let argvs = process.argv;// console.log('输出信息:', argvs, process.argv); function resolve(dir) { return path.join(__dirname, "..", dir); } function getParams(key) { // argvs ? argvs.indexOf(key) != -1 ? item.split('=')[1] : [] : [] // console.log("当前配置的信息:", key, argvs, process.argv); let name = ""; if (argvs) { for (let i = 0; i < argvs.length; i++) { if (argvs[i].includes(key)) { name = argvs[i]; } } if (name) { return name.split('=')[1]    } else { return "" } } else { return "" }} function getModuleAlias() { let alias = {} projects.forEach((key) => { alias[`@${key}`] = resolve(`src/${key}`) }); return alias} function getModuleProcess(name) { if (!projects.includes(name)) { name = projects[0] } return { name, entry: ["babel-polyfill", `./src/${name}/main.js`], alias: resolve(`src/${name}`), index: path.resolve(__dirname, `../dist/${name}/index.html`), assetsRoot: path.resolve(__dirname, `../dist/${name}/`) }}let resultEvent = String(process.env.npm_Lifecycle_event).split(":");let moduleName = getParams('name') || resultEvent[1]// let first1 = getParams('name') || "空";// let first2 = resultEvent || "空"let moduleConfig = { modules: projects, moduleAlias: getModuleAlias(), process: getModuleProcess(moduleName)}module.exports = moduleConfig

其实最重要的地方是在于 process.argv 和path.resolve方法 以及process.env.npm_Lifecycle_event的使用,有兴趣的可以在执行的过程中console一下 这些 变量 或方法,不想console 的话,可以看我下面的解说,

首先 process.argv是下图得到的一个数组 关于当前执行 npm run dev:projectA后的输出,


process.argv内容

此处提一句如果想要自定义去调试或者打包自定义的项目入口,需要提前设置scripts的命令在package.json文件中"dev:projectA": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",此处的dev:冒号后面的 内容 对应的是 项目文件夹的名字,而且要与 multi.conf.js文件的第一行的 projects 里面的数组的 元素对应,因为我就是通过 process.env.npm_Lifecycle_event 这个 nodejs的系统变量拿到的 一段文本:
dev:projectA 因此可以通过这种方式获取 当前 dev的项目 入口名称,ok,此时拿到 当前 要调试的项目入口名称 其次 我还通过path的resolve方法拿到了 当前项目已config文件目录结尾的绝对路径,so,我可以通过 拼接的方式 把我想要的 文件地址给一一拼接出来,


getModuleProcess

所以通过对路径的拼接,实现 项目的运行,然后还没完,这里只是自定义配置了一下 webpack的配置,一些原有的配置还是需要修改的
首先是config\index.js文件,因为项目主文件不是在src下面,而是在你自定义的 项目名称下面 ,可能有些兄弟看到这里 有些疑惑:


这个是我的src主目录下面的目录

看到这里 还是疑惑的兄弟,可以开一个vue-cli针对性的去看一下,ok继续 下面config\index要修改的地方

    moduleConfig对象就是我的multi.conf 引入 的对象let moduleConfig = require('./multi.conf');

修改  build\webpack.base.conf.js 文件:moduleConfig 同上

此文件的修改 目的是因为 之前build的主目录已经被我们自定义修改 所以要给使用主目录的地方做处理  其次就是添加 @符号作为当前运行的项目绝对路径到全局 

以及把项目组的绝对路径也添加到 全局,可以通过 @项目名 的方式 直接进入该项目目录内部,

"scripts": {

// ...省略

    "runa": "npm run dev:projectA",

    "dev:projectA": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",

    "builda": "node build/build.js name=projectA",

    "runb": "npm run dev:projectB",

    "dev:projectB": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",

    "buildb": "node build/build.js name=projectB"

// ...省略

  },

"buildb": "node build/build.js name=projectB"

这个是生产环境打包命令也是需要添加到buildb内的,我把 项目名写到命令里面 通过 key:value 的方式携带到逻辑代码里面了就可以做打包成为生产环境做处理了

其次是 需要在 build 文件目录下 创建一个 zip.js文件下面是代码

let pack = require('../package.json');let path = require('path');let FileManagerPlugin = require('filemanager-webpack-plugin');let XeUtiles = require('xe-utils');let moduleConfig = require('../config/multi.conf');let argvs = process.argv.slice(2); function getParams(key) { let data = argvs.find((res) => { res.split('=')[0] === key }) return data ? data.split('=') : []}let datetime = XeUtiles.toDateString(Date.now, 'yyyyMMddHHmmss');let plugins = [];let zipPros = getParams('zip');if (zipPros.length > 0) { plugins.push(new FileManagerPlugin({ onEnd: { delete: [ path.join(__dirname, `../dist/${moduleConfig.process.name}_*.zip`) ], archive: [{ source: path.join(__dirname, `../dist/${moduleConfig.process.name}`), destination: path.join(__dirname, zipPros[1] ? `../${pack.name}_${zipPros[1]}.zip` : `../${pack.name}_${moduleConfig.process.name}_${pack.version}_${datetime}.zip`) }] } }))}module.exports = plugins

这个文件的目录,感觉 大佬应该是想作为 zip打包处理,build的时候 直接把整个项目打包成一个 zip文件

"scripts": {

    // ...省略

    "build:projectA:zip": "node build/build.js name=projectA zip",

    "build:projectB:zip": "node build/build.js name=projectB zip",

    "build:projectC:zip": "node build/build.js name=projectC zip",

    // ...省略

  },

这些就是打包并压缩的命令了,因为原文博客没有给出 zip文件的使用地方,不知道是不是作者忘记了,如果想作为zip文件打包项目可以在 build\webpack.prod.conf.js 文件内的 plugins里面调用

const zip = require("./zip")

但是经过测试:打包zip的命令是有问题的 不知道是我这里的问题还是代码问题 反正经过修改可以打包了

 "build:project1:zip": "node build/build.js name=project1 zip=project1",

打包命令最好 zip也是通过 key:value的方式传递到zip里面判断

需要修改一下getParams 方法来判断是否打包成zip



ok,致辞完结,喜欢能与大家共同学习

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

推荐阅读更多精彩内容

  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,616评论 7 110
  • 原文http://www.cnblogs.com/libin-1/p/6596810.html 版本号 vue-c...
    tengrl阅读 3,579评论 0 0
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • 原理 使用2017年8月更新的opencv最新版本,使用CascadeClassifier类分类器可以一步做出人脸...
    圣_狒司机阅读 585评论 0 50
  • #如何写好一篇公文# 接任务,莫急写;先立意,次思考;再提纲,后材料;言由衷,辞达意;此几条,谨记上;过程中...
    老宋的日记阅读 103评论 0 0