麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JavaScript > 正文

詳解vue-cli3多頁(yè)應(yīng)用改造

2019-11-19 11:24:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

需求

一個(gè)平臺(tái)P,包含產(chǎn)品a、b、c、d、e。各產(chǎn)品UI樣式風(fēng)格統(tǒng)一,且會(huì)用到公共配置(HOST、是否添加埋點(diǎn)js)、組件(頭部導(dǎo)航、表格、搜索框)、方法(請(qǐng)求攔截、生成UUID)。

現(xiàn)狀:由于歷史遺留原因,各產(chǎn)品為獨(dú)立SPA、各自維護(hù),配置、組件也都自成一體,只是大概樣式上保持了一致,但細(xì)節(jié)(比如同一面包屑樣式,左邊距5px、8px都有)都不一致。
這種情況下,改組件、改配置都得一改改多個(gè)地方,且有些項(xiàng)目是vue-cli2、有些是vue-cli3,項(xiàng)目間依賴包的版本也不一致,維護(hù)起來(lái)非常不友好。

目標(biāo):整合各產(chǎn)品單頁(yè)應(yīng)用為MPA,提取公共文件(主題、配置、組件、方法),減少規(guī)范性東西的維護(hù)成本。

目錄結(jié)構(gòu)對(duì)比

整合前

bds-bank-fe│  README.md││// 靜態(tài)資源輸出目錄│└───dist│  └───index.html + static // 平臺(tái)首頁(yè)│  └───label // 產(chǎn)品a│  │  └───index.html + static│  └───metrics // 產(chǎn)品b│  └───service // 產(chǎn)品c│  └───help // 產(chǎn)品d││// 項(xiàng)目路徑│└───help-center // 產(chǎn)品d└───portal-page // 平臺(tái)首頁(yè)└───service-doc // 產(chǎn)品c└───unify-label // 產(chǎn)品a└───unify-metrics // 產(chǎn)品b│  └───build│  └───config│  └───src

整合后

│// 靜態(tài)資源輸出目錄│└───dist│  └───index.html│  └───label.html│  └───metric.html│  └───service.html│  └───stocktake.html│  └───css│  └───js│  └───img├── public│  └───favicon.ico│  └───index.html││// 項(xiàng)目路徑│├── src│   └── assets│   └── components│   ├── pages│     ├── index│     ├── label│     ├── metric│     ├── service│     ├── stocktake

實(shí)現(xiàn)

vue-cli 3.0官方支持多頁(yè),重點(diǎn)在于vue.config.js文件中pages這個(gè)配置項(xiàng),每個(gè)頁(yè)面單獨(dú)配置entry、template、filename等。pages配置說(shuō)明

// 官網(wǎng)示例如下module.exports = { pages: {  index: {   // page 的入口   entry: 'src/index/main.js',   // 模板來(lái)源   template: 'public/index.html',   // 在 dist/index.html 的輸出   filename: 'index.html',   // 當(dāng)使用 title 選項(xiàng)時(shí),   // template 中的 title 標(biāo)簽需要是 <title><%= htmlWebpackPlugin.options.title %></title>   title: 'Index Page',   // 在這個(gè)頁(yè)面中包含的塊,默認(rèn)情況下會(huì)包含   // 提取出來(lái)的通用 chunk 和 vendor chunk。   chunks: ['chunk-vendors', 'chunk-common', 'index']  },  // 當(dāng)使用只有入口的字符串格式時(shí),  // 模板會(huì)被推導(dǎo)為 `public/subpage.html`  // 并且如果找不到的話,就回退到 `public/index.html`。  // 輸出文件名會(huì)被推導(dǎo)為 `subpage.html`。  subpage: 'src/subpage/main.js' }}

Step1: 創(chuàng)建新項(xiàng)目

選擇需要的Babel、Router、Vuex、eslint...

具體步驟參考官網(wǎng):創(chuàng)建一個(gè)項(xiàng)目

Step2: 修改配置文件vue.config.js

在根目錄下新建public文件夾,包含favicon.ico和index.html兩個(gè)文件。

index文件內(nèi)容如下:

<!DOCTYPE html><html lang="en"><head>  <meta charset="utf-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width,initial-scale=1.0">  <link rel="icon" href="<%= BASE_URL %>favicon.ico" rel="external nofollow" >  <title>P-公共服務(wù)平臺(tái)</title></head><body><noscript>  <strong>    We're sorry but page doesn't work properly without JavaScript enabled. Please enable it to continue.  </strong></noscript><div id="app"></div><!-- built files will be auto injected --></body></html>

然后,在根目錄下新建vue.config.js

const glob = require('glob')const path = require('path')const resolve = (dir) => path.join(__dirname, dir)const PAGES_PATH = './src/pages/*/*.js'module.exports = { pages: setPages(), // TODO:以下內(nèi)容非生成多頁(yè)應(yīng)用必須配置 lintOnSave: true, productionSourceMap: false, chainWebpack: config => {  /**   * 自動(dòng)化導(dǎo)入文件   */  const types = ['vue-modules', 'vue', 'normal-modules', 'normal']  types.forEach(   type => addStyleResource(config.module.rule('less').oneOf(type)))  /**   * 添加別名   */  config.resolve.alias   .set('@index', resolve('src/pages/index'))   .set('@label', resolve('src/pages/label'))   .set('@metrics', resolve('src/pages/metric'))   .set('@service', resolve('src/pages/service'))   .set('@stocktake', resolve('src/pages/stocktake'))  /**   * 菜單icon處理為svg-sprite   */  config.module   .rule('svg')   .exclude   .add(resolve('src/assets/icons/menus'))   .end()  config.module   .rule('svg-sprite-loader')   .test(//.svg$/)   .include   .add(resolve('src/assets/icons/menus')) // 處理目錄   .end()   .use('svg-sprite-loader')   .loader('svg-sprite-loader')   .options({    symbolId: 'icon-[name]'   }) }}/** * 組裝頁(yè)面 */function setPages () { let pages = {} glob.sync(PAGES_PATH).forEach(filepath => {  let fileList = filepath.split('/')  let fileName = fileList[fileList.length - 2]  pages[fileName] = {   entry: filepath,   template: 'public/index.html',   filename: `${fileName}.html`,   // title:   chunks: ['chunk-vendors', 'chunk-common', fileName]  } }) return pages}/** * 注入公共less * @param rule */function addStyleResource (rule) { rule.use('style-resource')  .loader('style-resources-loader')  .options({   patterns: [    path.resolve(__dirname, 'src/assets/styles/variable.less')   ]  })}

Step3: 拷貝原項(xiàng)目src目錄至pages下,大概長(zhǎng)這樣

Step4: 各產(chǎn)品原項(xiàng)目下package.json依賴包都挪到根目錄下package.json,重新安裝

PS:由于依賴向上升級(jí),某些老版本依賴包可能會(huì)存在升級(jí)引發(fā)的問題,需要細(xì)心走查一遍。這里由于業(yè)務(wù)不一樣,就不詳細(xì)贅述了

然后npm start,完美啟動(dòng)~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 一级免费特黄视频 | 精品小视频 | 亚洲成人福利电影 | 日产精品久久久一区二区开放时间 | 国产精品久久久免费观看 | 男人的天堂毛片 | 羞羞答答视频 | 亚洲一区二区三区日本久久九 | 摸逼逼视频| 成人一级免费视频 | 久久久三区 | 久久久一区二区三区四区 | 最近国产中文字幕 | 国产1级视频 | 国产精品美女久久久久久不卡 | 精品国产一区二区三区在线观看 | 激情大乳女做爰办公室韩国 | 日本在线免费观看视频 | 国产精品视频导航 | 成人小视频在线播放 | 成人毛片视频在线观看 | 国产一区二区三区四区五区精品 | 欧美国产91 | 无遮挡一级毛片视频 | 中文有码一区二区 | 男人午夜小视频 | 中国女警察一级毛片视频 | 免费看国产视频 | av电影免费播放 | 精品国产乱码久久久久久丨区2区 | 黄色毛片前黄 | 亚洲第一成人在线观看 | 欧美成年性h版影视中文字幕 | 国内免费视频成人精品 | 亚洲成人免费影视 | 国产精品视频一区二区三区四区五区 | 在线观看91精品 | h视频在线观看免费 | 黄色大片在线免费观看 | 99精品视频在线导航 | 最新av在线播放 |