基于 vue-cli 2 实现,vue 多模块、vue多项目集成工程

Github项目地址 : https://github.com/BothEyes1993/vue-multi-module

目标:多模块集成的vue项目,多项目共用一份配置,可以互相依赖,也可以独立打包部署

使用业务场景

1.如果项目可能有对应多个不同UI界面;对于这样的场景你可能首先会想到,用样式主题就可以实现,基本的样式或者换肤是可以通过样式实现。但如果要实现更复杂的,比如不同两套UI的界面可能功能显示及样式都有差别,那就不得不单独拆成一个项目,但是这样又会造成每个项目很多冗余代码。

2.如果项目有多个子模块(同时子模块之间又存在互相依赖关系);对于这样的场景是可以把项目独立发布到npm仓库,但是这样又涉及到每个模块都需要独立编译好再发布,实际过程有显得有些繁琐(实际视情况而定)。

对于以上场景可以使用一个项目管理多个子模块也是一个不错的选择。

多页面和多模块区别

多页面:多页面是指一个项目有多个入口,打包是会生成多个html文件,实际开发过程中都是混合在一个项目中开发;

多模块:是指不同的业务模块可以进行拆分;各自独立运行、也可以互相引用,这一点和通过 npm 发布是类似的;对于一些项目本身不允许发布的情况下,既可以独立开发,又不需要发布到共有仓库(当然也可以通过建立私有仓库解决哈)

问题:

1,如何划分子模块;

2,如何分离可复用组件;

3,如何独立编译,每个子模块独立打包编译、运行;

优点

1,高复用性

2,统一管理依赖库

3,不同模块使用的依赖各自按需打包

4,模块之间相互独立运行、编译、打包

5,模块之间可以直接互相引用,不需要iframe(一般方式是通过iframe嵌入,这样的性能相当差)

一:开始创建项目

先用vue-lic创建个demo项目:

vue init webpack vue-multi-module

先看看创建成功的项目目录:

创建完后先跑起来看看:

npmrun dev

二:添加多项目模块

把src目录下的文件换成多模块的形式

build:编译、运行相关脚本文件

config:编译、运行相关配置文件

static:不需要编译的静态资源,放到对应的模块目录下

子模块1子模块2...

src:项目源码

comm:公共模块            script:公共js文件            components:公共组件    子模块1:            assets:样式、图片等资源文件            common:业务相关的公共文件            components:业务组件            router:路由配置            store:vuex相关            views:页面视图    子模块2:    子模块3:...

项目模块结构安装上面的改动完毕之后,控制台会报一些路径错误之类的:

这是因为webpack.base.conf.js里面的main.js的路径发生改变导致的,之前项目是单模块只要一个main.js,现在换成多模块之后每个模块都有自己独立的main.js,所以要修改配置。

三:修改配置

1.增加 config/multi.conf.js :多模块配置文件,定义各个模块自己的端口,名称,转发规则,静态资源

.............// 多模块独立配置varimportModules = [newMultiModule('project1', {port:8091,statics: ['static1'],proxyTable: {'/servers1/': getProxyConfig(PROXY_DOMAIN_DEFAULT)    }  }),newMultiModule('project2', {port:8092,statics: ['static2'],proxyTable: {'/servers2/': getProxyConfig(PROXY_DOMAIN_DEFAULT)    }  }),newMultiModule('project3', {port:8093,statics: ['static3'],proxyTable: {'/servers3/': getProxyConfig(PROXY_DOMAIN_DEFAULT)    }  }),newMultiModule('project4', {port:8094,statics: ['static4'],proxyTable: {'/servers4/': getProxyConfig(PROXY_DOMAIN_DEFAULT)    }  })]..........

2.修改 build/webpack.base.conf.js 文件:修改启动项目的入口文件,添加各个模块的别名

..............module.exports = {  context:path.resolve(__dirname,'../'),  entry: multiConfig.process.entry,output: {path:config.build.assetsRoot,    filename:'[name].js',    publicPath: process.env.NODE_ENV ==='production'?config.build.assetsPublicPath      :config.dev.assetsPublicPath  },  resolve: {    extensions: ['.js','.vue','.json'],    alias: {'vue$':'vue/dist/vue.esm.js','@comm': resolve(`src/comm`),'@': multiConfig.process.alias,      ...multiConfig.moduleAlias    }  },.............

以上两个配置加上之后之前的main.js错误就消失了,但是又会报一些语法错误:

这是因为项目中的用了sass语法和一些es6语法缺少转码包,所以要加上对应的包:

到这里项目就可以正常启动了:

3.修改package.json文件

这里默认启动的是project1,如果需要启动project2,project3,就需要在package.json里面加对应的script

现在可以启动:npm run dev:project2

可能大家注意到了每次启动的时候端口都是一样的:

这样如果同时启动多个项目就没法区分谁是谁了,所以要在webpack.dev.conf.js里面的compilationSuccessInfo/messages里面加上对应项目的提示信息和自定义端口,以及每个项目的代理转发地址也不同,也要从multi.conf.js获取,涉及到修改以下的两个配置文件

4.修改webpack.dev.conf.js和config下的index.js文件

webpack.dev.conf.js:修改本地转发规则proxy(指向multi),修改启动后的描述文字

// Add FriendlyErrorsPluginlethost = ['localhost','127.0.0.1','0.0.0.0'].includes(devWebpackConfig.devServer.host) ?'localhost': devWebpackConfig.devServer.host      devWebpackConfig.plugins.push(newFriendlyErrorsPlugin({compilationSuccessInfo: {messages: [chalk`{bold.rgb(255,255,0) [${pack.name}=>${multiConfig.process.name}]} App running at:\n - Local:  {bold.cyan http://${host}:${port}${config.dev.assetsPublicPath}}\n - Network: {bold.cyan http://${getIPAdress()}:${port}${config.dev.assetsPublicPath}}`]        },onErrors: config.dev.notifyOnErrors        ? utils.createNotifierCallback()        :undefined}))      resolve(devWebpackConfig)    }  })})

index.js:修改所有启动端口(port)和静态资源地址(static)

dev: {// Paths    assetsSubDirectory: multiConfig.process.assetsSubDirectory,    assetsPublicPath: multiConfig.process.assetsPublicPath,    proxyTable:null,    // Various Dev Server settings    host: multiConfig.process.host, // can be overwritten byprocess.env.HOSTport: multiConfig.process.port, // can be overwritten byprocess.env.PORT,ifportisinuse, a free one will be determined    autoOpenBrowser:false,    errorOverlay:true,    notifyOnErrors:true,    poll:false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-

到这里本地启动的名称,端口,代理,静态资源都已经区分开了。接下来打包的时候也要按需打包每个模块项目自己的依赖的资源:

5.修改package.json和config下的index.js文件

package.json:新加命令

"build": "npminstall&& npm runbuild:project1 && npm runbuild:project2 && npm runbuild:project3 && npm runbuild:project4",

    "build:project1": "nodebuild/build.jsname=project1",

    "build:project1:zip": "nodebuild/build.jsname=project1 zip",

    "build:project2": "nodebuild/build.jsname=project2",

    "build:project2:zip": "nodebuild/build.jsname=project2 zip",

    "build:project3": "nodebuild/build.jsname=project3",

    "build:project3:zip": "nodebuild/build.jsname=project3 zip",

    "build:project4": "nodebuild/build.jsname=project4",

    "build:project4:zip": "nodebuild/build.jsname=project4 zip",

config下的index.js:各模块分开打包后的路径

build: {// Template for index.htmlindex: multiConfig.process.index,// PathsassetsRoot: multiConfig.process.assetsRoot,assetsSubDirectory: multiConfig.process.assetsSubDirectory,assetsPublicPath: multiConfig.process.assetsPublicPath,  }

6.webpack.prod.conf.js:打包的时候静态资源按需copy拉取(CopyWebpackPlugin),添加模块压缩添加packZip.js。

newCopyWebpackPlugin(multiConfig.process.publics.filter(name=>isDirectory(path.resolve(__dirname,`../static/${name}`))).map(name=>{return{from: path.resolve(__dirname,`../static/${name}`),to: config.build.assetsSubDirectory,ignore: ['.*']      }    })),// pack zip...require('./packZip')

packZip.js:依赖filemanager-webpack-plugin打包zip组件,package.json相应添加

.............  plugins.push(newFileManagerPlugin({onEnd: {delete: [        path.join(__dirname,`../${pack.name}_${multiConfig.process.name}_*.zip`)      ],archive: [{source: path.join(__dirname,`../dist/${multiConfig.process.name}`),destination: path.join(__dirname, zipPros[1] ?`../${pack.name}_${zipPros[1]}.zip`:`../${pack.name}_${multiConfig.process.name}_v${pack.version}_${datetime}.zip`)      }]    }  }))}

到这里模块项目已经实现多模块启动,按需打包,压缩等功能

完整项目地址 : https://github.com/BothEyes1993/vue-multi-module

转载地址:https://www.cnblogs.com/both-eyes/p/10836230.html  转载请注明出处!

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

推荐阅读更多精彩内容