成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:4日期: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)什么?所謂分模塊打包,那么各個(gè)模塊內(nèi)就必須得有自己獨(dú)立的入口文件,路由文件。按照這種構(gòu)想,我在一個(gè)新的腳手架src目錄下新建了一個(gè)projects目錄:

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

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

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

二、打包單個(gè)模塊

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

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

我們可以從這里入手。

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

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

現(xiàn)在我們的思路大概是這樣的,當(dāng)我們執(zhí)行打包命令的時(shí)候,通過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, // 是否自動(dòng)打開瀏覽器頁面 host: '0.0.0.0', // 指定使用一個(gè) 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 + '/'};

寫到這里我們就建立一個(gè)完整的小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)

一個(gè)大型項(xiàng)目必然會(huì)有公共模塊,這里會(huì)寫一個(gè)導(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)航

這里會(huì)使用iview作為ui組件,但也因此有一個(gè)問題,我的A,B,C,D四個(gè)項(xiàng)目每個(gè)項(xiàng)目引入一遍UI框架,那打包出來整個(gè)項(xiàng)目將會(huì)非常的大,所以我們?cè)?b>子項(xiàng)目必須采用按需引入的方式。(項(xiàng)目中還是下載整個(gè)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.piao2010.com/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(shí)候會(huì)打包太多。

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

四、demo地址

https://github.com/Oralinge/pointsmodule

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

標(biāo)簽: Vue
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品亚洲午夜一区二区三区| 欧美日韩精品一区视频| 色婷婷激情一区二区三区| 亚洲欧洲精品一区二区三区| 91最新地址在线播放| 日韩午夜中文字幕| 国产suv精品一区二区883| 日韩一二三区视频| 国产激情一区二区三区桃花岛亚洲| 欧美在线三级电影| 美腿丝袜一区二区三区| 色偷偷成人一区二区三区91| 亚洲国产成人91porn| 国产亚洲亚洲| 国产精品久久久久久久久图文区| 欧美呦呦网站| 日本一区二区三区在线不卡| 午夜视频久久久| 中文字幕一区二区不卡| 亚洲午夜高清视频| 18欧美乱大交hd1984| 亚洲天堂成人| 自拍偷自拍亚洲精品播放| 亚洲黄色影片| 亚洲精品乱码久久久久久| 日韩视频在线观看国产| 亚洲精品免费一二三区| 中日韩视频在线观看| 午夜精品久久久久久久久久久| 午夜在线播放视频欧美| 日韩1区2区3区| 欧美日韩欧美一区二区| 国产精品99久久久久久似苏梦涵| 日韩精品一区二区三区四区 | 91老师国产黑色丝袜在线| 国产亚洲美州欧州综合国| 国产自产精品| 亚洲一区二区三区中文字幕| 色哟哟国产精品| 国产美女主播视频一区| 欧美tk—视频vk| 国产在线欧美| 亚洲mv在线观看| 69久久99精品久久久久婷婷 | 久久中文在线| 狠狠色丁香久久婷婷综合_中 | 亚洲乱码日产精品bd| 亚洲免费婷婷| 经典三级一区二区| 亚洲精品一区二区在线观看| 欧美激情性爽国产精品17p| ...av二区三区久久精品| 久久国产99| 国产精品一级片在线观看| 国产欧美一区二区精品性色超碰| 9色精品在线| 麻豆精品新av中文字幕| 欧美tickle裸体挠脚心vk| 欧美午夜国产| 亚洲成a人v欧美综合天堂| 7777精品伊人久久久大香线蕉超级流畅| www.亚洲精品| 亚洲精品久久嫩草网站秘色| 欧美日韩亚洲另类| 欧美激情视频一区二区三区在线播放| 亚洲综合激情小说| 欧美一区二区三区精品| 亚洲高清av| 国产又黄又大久久| 国产精品久久久久久久久图文区 | 狼狼综合久久久久综合网| 风间由美中文字幕在线看视频国产欧美| 国产欧美精品国产国产专区 | 另类欧美日韩国产在线| 精品国产制服丝袜高跟| 99re66热这里只有精品4| 精品一区二区久久| 国产人妖乱国产精品人妖| 香蕉免费一区二区三区在线观看 | 亚洲成人精品一区二区| 日韩一区二区三区精品视频| 在线日韩欧美| 国产美女在线观看一区| 亚洲色图.com| 欧美日韩免费电影| 国产一区在线免费观看| 美腿丝袜在线亚洲一区| 国产精品天美传媒| 欧美区在线观看| 在线成人h网| 国内精品自线一区二区三区视频| 国产精品久久影院| 在线成人小视频| 国产日韩在线一区二区三区| 不卡在线视频中文字幕| 日韩国产在线观看| 国产日韩欧美精品在线| 欧美性视频一区二区三区| 黄色亚洲精品| 国产在线精品一区二区三区不卡 | 99久久国产综合精品女不卡| 午夜精品在线看| 国产精品午夜免费| 欧美探花视频资源| 黄色av日韩| 国产成人免费9x9x人网站视频| 日韩一区在线播放| 5月丁香婷婷综合| 亚洲欧美日韩精品久久久 | 韩国中文字幕2020精品| 国产精品私人影院| 欧美日本高清视频在线观看| 亚洲精品精选| 99v久久综合狠狠综合久久| 蜜桃一区二区三区四区| 综合中文字幕亚洲| 日韩三级视频在线观看| 色视频欧美一区二区三区| 精品91视频| 懂色中文一区二区在线播放| 午夜精品一区二区三区电影天堂 | 99麻豆久久久国产精品免费| 麻豆久久一区二区| 亚洲高清免费视频| 国产精品进线69影院| 日韩欧美一区在线观看| 欧美最新大片在线看| 国产精品久久国产三级国电话系列| 色综合久久中文综合久久97| 九色|91porny| 三级久久三级久久| 亚洲人成精品久久久久| 久久久美女毛片| 欧美片在线播放| 91精品办公室少妇高潮对白| 国产一区二区三区黄| 伊人久久综合| 欧美在线首页| 波多野结衣一区二区三区| 狠狠色丁香婷综合久久| 天天综合天天综合色| 亚洲综合在线视频| 日韩一区欧美一区| 欧美高清在线一区二区| 精品成人一区二区| 日韩一二三区不卡| 欧美日韩精品欧美日韩精品一综合| 麻豆亚洲精品| 一区二区三区三区在线| 亚洲性图久久| 欧美极品一区| 91视频一区二区三区| 不卡视频一二三| 成人黄色网址在线观看| 国产成人在线免费观看| 国产综合成人久久大片91| 另类的小说在线视频另类成人小视频在线| 日韩在线卡一卡二| 视频一区欧美精品| 五月天欧美精品| 午夜精品福利在线| 亚洲国产裸拍裸体视频在线观看乱了 | 91精品国产色综合久久不卡电影| 欧美色综合久久| 色哟哟日韩精品| 色婷婷综合久久久久中文一区二区 | 一区二区在线免费观看| 亚洲精品视频一区| 亚洲精品国产成人久久av盗摄| 成人欧美一区二区三区1314| 中文字幕欧美一| 亚洲三级电影网站| 亚洲老司机在线| 亚洲免费高清视频在线| 亚洲美女在线国产| 一区二区三区中文在线观看| 亚洲精品成人精品456| 亚洲一区二三区| 亚洲成av人片www| 日韩和欧美一区二区三区| 日本不卡免费在线视频| 蜜桃视频免费观看一区| 国内精品久久久久影院一蜜桃| 国产一区日韩二区欧美三区| 国产激情视频一区二区三区欧美 | 精东粉嫩av免费一区二区三区| 九色综合狠狠综合久久| 国产精品一区二区免费不卡| 成人免费黄色在线| 91蝌蚪porny九色| 欧美午夜精品久久久久免费视| 狠狠色狠狠色综合人人| 亚洲黄色一区二区三区| 亚洲一区二区三区高清不卡| 色综合久久久久| 欧美乱妇一区二区三区不卡视频| 欧美电影免费观看高清完整版在线| 2022国产精品视频| 国产精品久久久久精k8| 亚洲制服丝袜av|