电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

瀏覽:3日期:2022-11-20 14:19:57

本文以vue-cli3+為例,實(shí)現(xiàn)多系統(tǒng)集成下的分模塊打包。分模塊打包方式多種多樣,下文可適用于多系統(tǒng)之間互不干擾,主系統(tǒng)可集成各子系統(tǒng),各子系統(tǒng)又可單獨(dú)運(yùn)行的業(yè)務(wù)場景。

一、目標(biāo)

我們要實(shí)現(xiàn)什么?所謂分模塊打包,那么各個模塊內(nèi)就必須得有自己獨(dú)立的入口文件,路由文件。按照這種構(gòu)想,我在一個新的腳手架src目錄下新建了一個projects目錄:

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

如上圖,可以看到Aproject、B、C、D四個項(xiàng)目。我在A項(xiàng)目中建了assets,common和views文件夾,其中assets可以再建img和css的文件夾,common內(nèi)可以放公共組件或者方法,views頁面可以放頁面,甚至你還可以建一個components文件夾專門用來放組件。

好了,我們的視圖目錄結(jié)構(gòu)大概就是上面的樣子。我們期待的是,我們可以打包這個A模塊這個‘小vue’,就像打包一個完整vue的項(xiàng)目一樣。那么如何實(shí)現(xiàn)這部分呢?

二、打包單個模塊

我們知道,在package.json中,有項(xiàng)目啟動,打包的命令。

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

我們可以從這里入手。

這里就不得不提到cross-env這個模塊了。我們之前在設(shè)置生產(chǎn)環(huán)境,測試環(huán)境,開發(fā)環(huán)境時也會用到這個模塊。在這里不詳細(xì)表述了。

cross-env:npm install --save-dev cross-env

現(xiàn)在我們的思路大概是這樣的,當(dāng)我們執(zhí)行打包命令的時候,通過cross-env去找到我們的入口文件,然后再打包。

所以我們可以模仿環(huán)境變量的寫法,在package中寫入如下圖代碼。

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

代碼:

'dev:projectA': 'cross-env PROJECT_NAME=projectA vue-cli-service serve', 'dev:projectB': 'cross-env PROJECT_NAME=projectB vue-cli-service serve', 'dev:projectC': 'cross-env PROJECT_NAME=projectC vue-cli-service serve', 'dev:projectD': 'cross-env PROJECT_NAME=projectD vue-cli-service serve', 'build:projectA': 'cross-env PROJECT_NAME=projectA vue-cli-service build', 'build:projectB': 'cross-env PROJECT_NAME=projectB vue-cli-service build', 'build:projectC': 'cross-env PROJECT_NAME=projectC vue-cli-service build', 'build:projectD': 'cross-env PROJECT_NAME=projectD vue-cli-service build',

寫完了這些,我們就可以著手模仿vue配置小vue的文件了。

在main.js中配置如下代碼:

import Vue from 'vue';import App from './App.vue';import router from './router';import store from './store';Vue.config.productionTip = false;new Vue({ router, store, render: h => h(App)}).$mount('#app');

在App.vue中配置如下代碼:

<template> <div id='app'> <router-view /> </div></template><style lang='less'></style>

在router.js中配置如下代碼

import Vue from 'vue';import Router from 'vue-router';import Home from './views/Home.vue';Vue.use(Router);export default new Router({ routes: [ { path: '/', name: 'home', component: Home } ]});

在page文件夾中建立Home.vue,寫入如下代碼:

<template> <div> 我是a項(xiàng)目 </div></template><script>export default {};</script><style></style>

在項(xiàng)目最外層建立config文件夾,在其中新建projectsConfig.js寫入:

const config = { projectA: { pages: { index: { entry: 'src/projects/projectA/main.js', template: 'public/index.html', filename: 'index.html' } }, devServer: { port: 8080, // 端口地址 open: false, // 是否自動打開瀏覽器頁面 host: '0.0.0.0', // 指定使用一個 host,默認(rèn)是 localhost https: false, // 使用https提供服務(wù) disableHostCheck: true, // 設(shè)置代理 proxy: { '/eopenhapi': { target: 'http://open.jdpay.com', changeOrigin: true }, '/hapi': { target: 'http://open.jdpay.com', changeOrigin: true } } } }, projectB: {}, projectC: {}};module.exports = config;

把projectsConfig.js并入vue.config.js,vue.config.js中代碼如下

const config = require('./config/projectsConfig.js');let projectName = process.env.PROJECT_NAME;module.exports = { ...config[projectName], // pages: conf.pages, // 基本路徑 // baseUrl: ’./’,//vue-cli3.3以下版本使用 publicPath: './', // vue-cli3.3+新版本使用 // 輸出文件目錄 outputDir: 'dist/' + projectName + '/'};

寫到這里我們就建立一個完整的小vue了。

運(yùn)行命令 cnpm run dev:projectA

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

運(yùn)行命令 cnpm run build:projectA

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

效果完美。

三、打包總項(xiàng)目及子系統(tǒng)

一個大型項(xiàng)目必然會有公共模塊,這里會寫一個導(dǎo)航欄作為公共組件。

在projects下建立公共模塊的文件夾common,寫入前面A項(xiàng)目的目錄結(jié)構(gòu),如圖:

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

在package.json中寫入運(yùn)行命令和打包命令。

'dev:common': 'cross-env PROJECT_NAME=common vue-cli-service serve', 'build:common': 'cross-env PROJECT_NAME=common vue-cli-service build',

在Home.vue中寫公共導(dǎo)航

這里會使用iview作為ui組件,但也因此有一個問題,我的A,B,C,D四個項(xiàng)目每個項(xiàng)目引入一遍UI框架,那打包出來整個項(xiàng)目將會非常的大,所以我們在項(xiàng)目必須采用按需引入的方式。(項(xiàng)目中還是下載整個ivew)

寫入如下代碼:

<template> <div class='main-content'> <Layout> <header class='head-box'> <Menu mode='horizontal' theme='primary' active-name='1' @on-select='menuClick' > <div class='layout-logo'>Oralinge</div> <div class='layout-nav'> <div class='layout-nav-content'> <!-- 系統(tǒng)列表 --> <span v-for='(item, index) in systemList' :key='index'><MenuItem :name='item.basepath + ’?systemId=’ + item.systemId' @click='go(item)'> <Icon type='ios-navigate'></Icon> {{ item.title }}</MenuItem> </span> </div> </div> <div class='layout-right'> <Dropdown> <!-- 登錄姓名 --> <a href='javascript:void(0)' rel='external nofollow' >{{ user.userName }}<Icon type='ios-arrow-down'></Icon> </a> <!-- 退出登錄 --> <DropdownMenu slot='list'><DropdownItem name='logout'>退出登錄</DropdownItem> </DropdownMenu> </Dropdown> </div> </Menu> </header> </Layout> <iframe :src='http://www.hdgsjgj.cn/bcjs/systemUrl' frameborder='0' ></iframe> </div></template><script>import { Layout, Menu, MenuItem, Dropdown, DropdownItem, DropdownMenu} from 'view-design';export default { components: { Layout, Menu, MenuItem, Dropdown, DropdownItem, DropdownMenu }, data() { return { systemUrl: '', isFullscreen: false, loading: false, systemList: [ { title: 'A項(xiàng)目', basepath: 'http://localhost:8080/#/', systemId: 'A' }, { title: 'B項(xiàng)目', basepath: 'http://localhost:8082/#/', systemId: 'B' }, { title: 'C項(xiàng)目', basepath: 'http://localhost:8083/#/', systemId: 'c' }, { title: 'D項(xiàng)目', basepath: 'http://localhost:8084/#/', systemId: 'D' } ], user: {} }; }, mounted() { this.systemUrl = this.systemList[0].basepath + '?systemId=' + this.systemList[0].systemId; }, methods: { menuClick(name) { this.systemUrl = name; } }};</script><style lang='less' scoped>@head-height: 50px;.main-content { height: 100%; padding-top: @head-height; box-sizing: border-box; overflow: hidden;}.head-box { width: 100%; height: @head-height; line-height: @head-height; position: fixed; top: 0; left: 0; min-width: 1200px; .ivu-menu-horizontal { height: 100%; line-height: @head-height; } .layout-logo { display: inline-block; width: 200px; color: #fff; font-size: 28px; text-align: center; vertical-align: top; position: absolute; left: 0; top: 0; background-color: #2d8cf0; z-index: 5; } .layout-nav { display: inline-block; width: 100%; height: 100%; padding-left: 200px; padding-right: 100px; box-sizing: border-box; overflow-x: auto; z-index: 4; &-content { // width: 100%; overflow: hidden; height: 100%; } } .layout-right { padding-right: 20px; padding-left: 20px; position: absolute; right: 0; top: 0; background-color: #2d8cf0; z-index: 5; a { color: #fff; } } .ivu-menu-item-active { font-size: 20px; }}</style>

效果:

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

B項(xiàng)目使用同樣的方法配置文件。配置后效果如下:

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

到這里,我們就基本實(shí)現(xiàn)了分模塊運(yùn)行以及集體運(yùn)行了。

下面看一下打包。

在分別運(yùn)行了B項(xiàng)目和common的打包命令以后,效果正常。

vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)

另外,我在這里采用了iframe的方式嵌入了其他項(xiàng)目,是因?yàn)橐氲姆绞酱虬臅r候會打包太多。

這樣做的好處就是公共項(xiàng)目僅僅作為一個外殼使用,其他項(xiàng)目與其并沒有太多的關(guān)聯(lián),保證了每個項(xiàng)目模塊的獨(dú)立性。

四、demo地址

https://github.com/Oralinge/pointsmodule

到此這篇關(guān)于vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue分模塊打包內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 聚丙烯酰胺_阴离子_阳离子「用量少」巩义亿腾厂家直销,售后无忧 聚合甘油__盐城市飞龙油脂有限公司 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 东亚液氮罐-液氮生物容器-乐山市东亚机电工贸有限公司 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 商秀—企业短视频代运营_抖音企业号托管 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 起好名字_取个好名字_好名网免费取好名在线打分 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 定制防伪标签_防伪标签印刷_防伪标签厂家-510品保防伪网 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | ASA膜,ASA共挤料,篷布色母料-青岛未来化学有限公司 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 数控走心机-双主轴走心机厂家-南京建克 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | ptc_浴霸_大巴_干衣机_呼吸机_毛巾架_电动车加热器-上海帕克 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 联系我们-腾龙公司上分客服微信19116098882 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 |