vue-cli3構(gòu)建多頁面:提取通用模板和入口文件,自動構(gòu)建多頁配置

本文鏈接:https://blog.csdn.net/guang_s/article/details/89406202
一、需要升級vue-cli的,請參照官網(wǎng)
https://cli.vuejs.org/zh/guide/installation.html

二徘跪、創(chuàng)建配置文件vue.config.js
1甘邀、使用vue create創(chuàng)建項目之后,我們看到項目里沒有像vue-cli2的配置文件垮庐,目錄如下:

2松邪、在根目錄創(chuàng)建vue.config.js文件,相關(guān)配置參數(shù)可參考:
https://cli.vuejs.org/zh/config/#pages

3哨查、添加multi-page模式配置
一個頁面需要配置對應(yīng)的 入口文件(entry)逗抑、模板文件(template)、生成的文件(filename)寒亥,如下:

vue.config.js文件
// vue.config.js

module.exports = {
pages: {
index: {
entry: 'src/pages/index/index.js',
template: 'src/pages/index/index.html',
filename: 'index.html',
chunks: ['chunk-vendors', 'chunk-common', 'index'] // 'chunk-vendors', 'chunk-common' 是公用資源文件
},
shop: {
entry: 'src/pages/shop/shop.js',
template: 'src/pages/shop/shop.html',
filename: 'shop.html',
chunks: ['chunk-vendors', 'chunk-common', 'shop']
}
}
};
頁面文件結(jié)構(gòu)

4邮府、如上,是vue-cli3為我們提供的多頁面配置护盈,相比vue-cli2要方便了很多挟纱。但是按照上面的方式進行配置的話:
我們每增加一個頁面都需要手動維護配置文件;
并且還需要維護入口文件和模板文件腐宋;
這樣會給開發(fā)帶來很多重復(fù)又繁瑣的工作紊服,所以我們需要提取公用模板文件和入口文件。
.

三胸竞、自動配置多頁參數(shù)欺嗤,提取公用模板以及自動創(chuàng)建入口文件
模板文件(template)只有id 和 title是不一樣的,我們可以通過htmlWebpackPlugin.options傳參解決卫枝;
入口文件(entry)只有id 和引用的vue文件路徑是不一樣的煎饼,但是因為import from 后面不支持接收變量,所以沒法通過傳參解決校赤,這個時候我們需要借助glob來自動創(chuàng)建入口文件吆玖;
module.exports.pages多頁面文件配置也需要借助glob來實現(xiàn)自動配置;
1马篮、安裝glob模塊
npm i glob -D
1
2沾乘、創(chuàng)建getPages方法,處理配置文件
const path = require('path');
const fs = require('fs');
const glob = require('glob');

// 配置選項
const config = {
pages: getPages()
};

// 獲取多頁面的配置數(shù)據(jù)
function getPages() {
const pages = {};

glob.sync('./src/pages/**/*.vue').forEach(function (pageUrl) {
    const ext = path.extname(pageUrl);
    const pageCode = path.basename(pageUrl, ext);
    
    // 生成入口文件
    const entryFile = `./entry/${pageCode}.js`;
    fs.exists(entryFile, function (exists) {
        if(exists) return;
        // 創(chuàng)建文件及寫入文件內(nèi)容
        const appTpl = '.' + pageUrl;
        const entryData = `import Vue from 'vue';\nimport App from '${appTpl}';\nVue.config.productionTip = false;\nnew Vue({ render: h => h(App) }).$mount('#${pageCode}'); `;
        fs.writeFile(entryFile, entryData, function(err){
            if(err) console.log(err);
        });
    });
    
    // 自定義頁面數(shù)據(jù)
    const pageData = {
        title: '',
        code: pageCode
    };
    // 配置多頁面
    pages[pageCode] = {
        entry: entryFile,               // 入口文件
        template: 'index.html',         // 模板文件
        filename: pageCode + '.html',   // 打包后的文件路徑
        minify: false,                  // 是否壓縮
        chunks: ['chunk-vendors', 'chunk-common', pageCode],   // 引入資源文件
        chunksSortMode: 'manual',       // 控制 chunk 的排序浑测。none | auto(默認(rèn))| dependency(依賴)| manual(手動)| {function}
        pageData: pageData
    };
});
return pages;

}

module.exports = config;
3翅阵、模板文件(public/index.html)
<%
const page = htmlWebpackPlugin.options.pageData || { title:'vue cli3' };
%>

<!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">
<title><%= page.title %></title>
</head>

<body>
<noscript>
<strong>很抱歉,如果沒有啟用javascript迁央,vue-cli3無法正常工作掷匠。請啟用它以繼續(xù)。</strong>
</noscript>
<div id="app">
<div id="<%= page.code %>"></div>
</div>

</body>

</html>
4岖圈、生成的入口文件(entry/index.js)
import Vue from 'vue';
import App from '../src/pages/index/index.vue';
Vue.config.productionTip = false;
new Vue({ render: h => h(App) }).$mount('#index');

四讹语、創(chuàng)建page.json文件,配置title
上面的配置文件可以看到幅狮,頁面title還沒有配置募强,這里我們采用創(chuàng)建page.json文件的方式來存儲頁面相關(guān)參數(shù):

{
"index": {
"title": "首頁"
},
"shop": {
"title": "商店"
},
"shopDetail": {
"title": "商店詳情"
}
}
// 自定義頁面數(shù)據(jù)
const pagesJson = require('./config/page.json');
const pageData = pagesJson[pageCode] || {};
Object.assign(pageData, {
code: pageCode
});

五株灸、配置主入口文件
1、增加入口文件main.js的配置
注:這樣配置的話擎值,最后打包的文件會生成app.html慌烧,vue cli3貌似并沒有提供直接配置入口文件的選項

// 配置選項
const config = {
pages: Object.assign(getPages(), {
app: './src/main.js' // 配置主入口文件(會生成 app.html,vue cli3并沒有提供直接配置入口文件的選項)
})
};
2鸠儿、第二種方式屹蚊,就是在每一個頁面的入口文件里面引入main.js,vue cli3會自動提取多次引用的模塊到chunk-common.js文件
const entryData = import Vue from 'vue';\nimport App from '${appTpl}';\nimport from '../src/main.js';\nVue.config.productionTip = false;\nnew Vue({ render: h => h(App) }).$mount('#${pageCode}');;
1
3进每、增加引入插件(app)
chunks: ['chunk-vendors', 'chunk-common', 'app', pageCode],
1
.

六汹粤、頁面文件結(jié)構(gòu),如下:

如此田晚,我們就只完成了模板文件和入口文件的自動化構(gòu)建嘱兼,現(xiàn)在我們就只需要編輯src/pages/*.vue了
.

七、項目地址(記得給星哦)
https://github.com/shiguang0116/vue-cli3-multipage

.

八贤徒、相關(guān)文章
vue-cli2構(gòu)建多頁面:改造原配置文件芹壕,實現(xiàn)自動構(gòu)建多頁面入口和模板文件
————————————————
版權(quán)聲明:本文為CSDN博主「猿始森林」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議接奈,轉(zhuǎn)載請附上原文出處鏈接及本聲明踢涌。
原文鏈接:https://blog.csdn.net/guang_s/article/details/89406202

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市序宦,隨后出現(xiàn)的幾起案子睁壁,更是在濱河造成了極大的恐慌,老刑警劉巖互捌,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潘明,死亡現(xiàn)場離奇詭異,居然都是意外死亡秕噪,警方通過查閱死者的電腦和手機钉疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巢价,“玉大人,你說我怎么就攤上這事固阁。” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵传于,是天一觀的道長顶考。 經(jīng)常有香客問我,道長并齐,這世上最難降的妖魔是什么漏麦? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任客税,我火速辦了婚禮,結(jié)果婚禮上撕贞,老公的妹妹穿的比我還像新娘更耻。我一直安慰自己,他們只是感情好捏膨,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布秧均。 她就那樣靜靜地躺著,像睡著了一般号涯。 火紅的嫁衣襯著肌膚如雪目胡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天链快,我揣著相機與錄音誉己,去河邊找鬼。 笑死域蜗,一個胖子當(dāng)著我的面吹牛巨双,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播地消,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炉峰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脉执?” 一聲冷哼從身側(cè)響起疼阔,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎半夷,沒想到半個月后婆廊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡巫橄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年淘邻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湘换。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彩倚,到底是詐尸還是另有隱情筹我,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布帆离,位于F島的核電站蔬蕊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哥谷。R本人自食惡果不足惜岸夯,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一麻献、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猜扮,春花似錦勉吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲜漩,卻和暖如春源譬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孕似。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工踩娘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喉祭。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓养渴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泛烙。 傳聞我的和親對象是個殘疾皇子理卑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • vue-config-js配置參考 vue-cli3 腳手架搭建完成后,項目目錄中沒有 vue.config.js...
    Rising_life閱讀 434,185評論 8 312
  • vue-cli3項目搭建配置以及性能優(yōu)化 在之前的開發(fā)中主要用的是vue-cli2蔽氨,最近空閑時間比較多藐唠,接下來有新...
    bayi_lzp閱讀 19,483評論 16 68
  • 前言 vue如果改成多頁,可以減少每次渲染的包大小鹉究,每個頁面也可以成為一個新的單頁宇立,可以更合理劃分業(yè)務(wù)內(nèi)容。分別寫...
    xurna閱讀 2,975評論 0 0
  • JavaScript教程 教程簡介 JavaScript是世界上最流行的腳本語言自赔,因為你在電腦妈嘹、手機、平板上瀏覽的...
    jojo2閱讀 298評論 0 0
  • 自從Movie Pass會費促銷到一月10刀以來這四個月绍妨,電影看得勤多了润脸。記得當(dāng)時參加者眾,把網(wǎng)站都擠到爆他去,等了4...
    sofabear閱讀 240評論 1 2