基于vue-cli搭建一個多頁面應(yīng)用

上篇文章中,我們已經(jīng)成功使用yarn創(chuàng)建了一個vue項目,但是項目模板是單頁面應(yīng)用,與多頁面應(yīng)用還有些差別匠抗,所以現(xiàn)在需要在此基礎(chǔ)上做一些調(diào)整:
關(guān)于多頁面應(yīng)用調(diào)整的思路分為以下兩個部分
一、項目目錄結(jié)構(gòu)調(diào)整

左一為項目目錄原結(jié)構(gòu)圖污抬,右一為修改過后的項目目錄結(jié)構(gòu)
1汞贸、在開發(fā)路徑src下增加modules和pages文件夾,分別存放模塊和頁面印机。
2矢腻、有關(guān)頁面的所有文件都放到同一文件夾下就近管理:
??????index.html(頁面模板)、
??????main.js(頁面入口文件)射赛、
??????App.vue(頁面使用的組件多柑,公用組件放到components文件夾下)、
??????router(頁面的路由配置)楣责、
??????assets(頁面的靜態(tài)資源)
??????把這些列出的文件都移到index文件夾下竣灌,并把main.js改為index.js,保證頁面的入口js文件和模板文件的名稱一致诫隅。

二、webpack配置調(diào)整
項目目錄調(diào)整好后帐偎,我們來進行webpack配置的調(diào)整,步驟如下:
1蛔屹、在build/utils.js中添加兩個方法:webpack多入口文件和多頁面輸出

var path = require('path')
var glob = require('glob')
var HtmlWebpackPlugin = require('html-webpack-plugin')  //對每個頁面單獨打包生成一個新頁面的插件
var PAGE_PATH = path.resolve(__dirname, '../src/pages')
var merge = require('webpack-merge')

//多入口配置
exports.entries = function() {
  var entryFiles = glob.sync(PAGE_PATH + '/*/*.js')
  var map = {}
  entryFiles.forEach((filePath) => {
    var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
    map[filename] = filePath
  })
  return map
}

//多頁面輸出配置
exports.htmlPlugin = function() {
  let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
  let arr = []
  entryHtml.forEach((filePath) => {
    let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
    let conf = {
      template: filePath,
      filename: filename + '.html',
      chunks: [filename],
      inject: true
    }
    if (process.env.NODE_ENV === 'production') {
      conf = merge(conf, {
        chunks: ['manifest', 'vendor', filename],
        minify: {
          removeComments: true,
          collapseWhitespace: true,
          removeAttributeQuotes: true
        },
        chunksSortMode: 'dependency'
      })
    }
    arr.push(new HtmlWebpackPlugin(conf))
  })
  return arr
}

2削樊、修改build/webpack.base.conf.js的入口配置
原單入口配置

module.exports = {
  entry: {
    app: './src/main.js'
  },
...

修改為多入口配置

module.exports = {
  entry: utils.entries(),
...

3、修改build/webpack.dev.conf.js和build/webpack.prod.conf.js的多頁面配置:把原有的頁面模板配置注釋或刪除兔毒,并把多頁面配置添加到plugins
(開發(fā)環(huán)境下)webpack.dev.conf.js:

 plugins: [
    ......
    //  new HtmlWebpackPlugin({
    //    filename: 'index.html',
    //    template: 'index.html',
    //    inject: true
    //  }),
    ......
  ].concat(utils.htmlPlugin())  

(生產(chǎn)環(huán)境下)webpack.prod.conf.js:

  plugins: [
    ......
    // new HtmlWebpackPlugin({
    //   filename: config.build.index,
    //   template: 'index.html',
    //   inject: true,
    //   minify: {
    //     removeComments: true,
    //     collapseWhitespace: true,
    //     removeAttributeQuotes: true
    //   },
    //   chunksSortMode: 'dependency'
    // }),
    ......
  ].concat(utils.htmlPlugin())

補充說明:

  • 在上面多頁面輸出配置中有這樣一行代碼:
    chunks: ['manifest', 'vendor', filename],
    這是html-webpack-plugin插件對頁面入口文件(即js文件)的限定漫贞,如果不設(shè)置則會把整個項目下的所有入口文件全部引入。
  • 為什么要引入 'manifest''vendor'?
    因為在build/webpack.prod.conf.js中有如下代碼:
    // split vendor js into its own file
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks: function (module, count) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, '../node_modules')
          ) === 0
        )
      }
    }),
    // extract webpack runtime and module manifest to its own file in order to
    // prevent vendor hash from being updated whenever app bundle is updated
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      chunks: ['vendor']
    }),

vendor模塊是指提取涉及node_modules中的公共模塊
manifest模塊是對vendor模塊做的緩存

關(guān)于CommonsChunkPlugin插件的詳細說明請閱讀官方文檔

  • 關(guān)于html-webpack-plugin插件的配置還有一行代碼:
    chunksSortMode: 'dependency'
    插件會按照模塊的依賴關(guān)系依次加載育叁,即:manifest迅脐,vendor,本頁面入口豪嗽,其他頁面入口...

至此谴蔑,多頁面應(yīng)用已經(jīng)搭建完畢,只需要在pages文件夾創(chuàng)建相應(yīng)的頁面文件即可龟梦。



參考資料:
https://github.com/tonyfree/blog/issues/1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隐锭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子计贰,更是在濱河造成了極大的恐慌钦睡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躁倒,死亡現(xiàn)場離奇詭異荞怒,居然都是意外死亡,警方通過查閱死者的電腦和手機秧秉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門褐桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人福贞,你說我怎么就攤上這事撩嚼。” “怎么了挖帘?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵完丽,是天一觀的道長。 經(jīng)常有香客問我拇舀,道長逻族,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任骄崩,我火速辦了婚禮聘鳞,結(jié)果婚禮上薄辅,老公的妹妹穿的比我還像新娘。我一直安慰自己抠璃,他們只是感情好站楚,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搏嗡,像睡著了一般窿春。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上采盒,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天旧乞,我揣著相機與錄音,去河邊找鬼磅氨。 笑死尺栖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烦租。 我是一名探鬼主播霜旧,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抽诉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炭懊,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤亩冬,失蹤者是張志新(化名)和其女友劉穎约素,沒想到半個月后妥凳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡锌杀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年甩栈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕再。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡量没,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突想,到底是詐尸還是另有隱情殴蹄,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布猾担,位于F島的核電站袭灯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绑嘹。R本人自食惡果不足惜稽荧,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望工腋。 院中可真熱鬧姨丈,春花似錦畅卓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歼争,卻和暖如春唐础,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾飞。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呀邢,地道東北人洒沦。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像价淌,于是被迫代替她去往敵國和親申眼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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