Vue-cli創(chuàng)建項(xiàng)目從單頁面到多頁面的方法
對(duì)于某些項(xiàng)目來說,單頁面不能很好的滿足需求,所以需要將vue-cli創(chuàng)建的單頁面項(xiàng)目改為多頁面項(xiàng)目。
需要修改以下幾個(gè)文件:
1、下載依賴glob
$npm install glob --save-dev
2、修改build下的文件
(1)修改webpack.base.conf.js
添加以下代碼:
var glob = require('glob'); var entries = getEntry('./src/pages/**/*.js')
將module.exports中的
entry: { app: './src/main.js' },
注釋掉,然后添加這一行代碼:
entry: entries,
至于entries是什么,別急呀,看下面:
添加一個(gè)方法:
//獲取入口js文件 function getEntry(globPath) { var entries = {}, basename, tmp, pathname; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); pathname = basename.split("_")[0]; //index_main.js得到index entries[pathname] = entry; }); return entries; }
這個(gè)文件修改成這樣子就可以了。
(2)修改webpack.dev.conf.js
添加以下代碼:
//引入 var glob = require('glob') var path = require('path')
將module.exports中的plugins里的
new HtmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: true }),
注釋掉,然后添加以下代碼:
function getEntry(globPath) { var entries = {},basename; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); entries[basename] = entry; }); return entries; } var pages = getEntry('src/pages/**/*.html'); for (var pathname in pages) { // 配置生成的html文件,定義路徑等 var conf = { filename: pathname + '.html', template: pages[pathname], // 模板路徑 inject: true, // js插入位置 chunks:[pathname] }; module.exports.plugins.push(new HtmlWebpackPlugin(conf)); }
這個(gè)文件修改到此就可以了。
(3)webpack.prod.conf.js
這個(gè)文件修改的套路與上一個(gè)文件類似
添加以下代碼: var glob = require('glob') 因?yàn)轫?xiàng)目在創(chuàng)建時(shí),生成項(xiàng)目的時(shí)候是直接將可選的所有依賴都選擇了yes,所以項(xiàng)目中的env的聲明定義如下:
var env = process.env.NODE_ENV === 'testing ? require('../config/test.env') : config.build.env ;
但是由于webpack.test.conf.js文件目前還沒有進(jìn)行修改,所以需要把這行聲明換成下面這行:
var env = config.build.env
將webpackConfig中的plugins里的
new HtmlWebpackPlugin({ filename: config.build.index, template: 'index.html', inject: true, minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, chunksSortMode: 'dependency' }),
注釋掉,在聲明定義webpackConfig的后面添加以下代碼:
function getEntry(globPath) { var entries = {}, basename; glob.sync(globPath).forEach(function (entry) { basename = path.basename(entry, path.extname(entry)); entries[basename] = entry; }); return entries; } var pages = getEntry('src/pages/**/*.html'); for (var pathname in pages) { var conf = { filename: process.env.NODE_ENV === 'testing' ? pathname + '.html' : config.build[pathname], template: pages[pathname], inject: true, minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, chunks:[pathname] } webpackConfig.plugins.push(new HtmlWebpackPlugin(conf)); }
此時(shí),這個(gè)文件也修改好了。
3、修改config下的文件
這個(gè)文件夾下,只需要修改一個(gè)文件:index.js 這個(gè)文件的作用是,尋找文件路徑,然后根據(jù)這個(gè)文件設(shè)置的目錄層級(jí),生成打包后的文件以及相應(yīng)的層級(jí)文件結(jié)構(gòu)。 添加以下代碼:
var build = { env: require('./prod.env'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '/', productionSourceMap: true, productionGzip: false, productionGzipExtensions: ['js', 'css'] } function getEntry(globPath) { var entries = {},basename; glob.sync(globPath).forEach(function(entry) { basename = path.basename(entry, path.extname(entry)); entries[basename] = entry; }); return entries; } var pages = getEntry('src/pages/**/*.html'); //入口 index: path.resolve(__dirname, '../dist/index.html') for (var pathname in pages) { build[pathname] = path.resolve(__dirname, '../dist/' + pathname + '.html') }
然后將module.exports中的build的值換成我們剛剛添加聲明的變量build。 如果希望修改打包后的目層級(jí)結(jié)構(gòu),可以在build中修改;還可以在build中增加我們需要定義的變量,比如我們需要將fabfile.py和favicon.ico拷貝到dist目錄下的a目錄下,就可以在build中定義一個(gè)屬性,
distA:path.resolve(__dirname, '../dist/a),
然后因?yàn)樵趙ebpack.prod.conf.js中已經(jīng)引入了'copy-webpack-plugin'(var CopyWebpackPlugin = require('copy-webpack-plugin')),我們就可以在 webpackConfig.plugins下添加如下代碼:
new CopyWebpackPlugin([ { from: path.resolve(__dirname, '../fabfile.py'), to: config.build.distA, template: 'fabfile.py' } ]) new CopyWebpackPlugin([ { from: path.resolve(__dirname, '../favicon.ico'), to: config.build.distA, template: 'favicon.ico' } ])
在src目錄下添加pages文件夾
目錄的層級(jí)結(jié)構(gòu)安排成類似于這種形式:
5、打包
做完以上修改,雖然本地運(yùn)行沒有問題,但是打包后,還是會(huì)有問題,會(huì)出現(xiàn)報(bào)錯(cuò):webpackJsonp is not defined
解決方式如下: 在webpack.prod.conf.js文件下的for (var pathname in pages)循環(huán)中定義的conf里,添加兩行代碼:
chunksSortMode: 'dependency', // dependency 頁面中引入的js按照依賴關(guān)系排序;manual 頁面中引入的js按照下面的chunks的數(shù)組中的順序排序; chunks: ['manifest', 'vender', pathname] // 生成的頁面中引入的js,'manifest', 'vender'這兩個(gè)js是webpack在打包過程中抽取出的一些公共方法依賴,其中,'manifest'又是從'vender'中抽取得到的,所以這三個(gè)js文件的依賴關(guān)系是 pathname依賴 'vender','vender'依賴'manifest'.
綜上,就是本次項(xiàng)目從單頁面到多頁面項(xiàng)目的轉(zhuǎn)變歷程,關(guān)于webpack.test.conf.js文件的修改,后續(xù)修改成功后,會(huì)繼續(xù)補(bǔ)充添加。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue 自定義提示框(Toast)組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 自定義提示框(Toast)組件的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08關(guān)于下拉類型多選組件Vue-Treeselect(鍵名轉(zhuǎn)換)
這篇文章主要介紹了關(guān)于下拉類型多選組件Vue-Treeselect(鍵名轉(zhuǎn)換),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Vue封裝組件利器之$attrs、$listeners的使用
vue通信手段有很多種,props/emit、vuex、event bus、provide/inject等,還有一種通信方式,那就是$attrs和$listeners,下面這篇文章主要給大家介紹了關(guān)于Vue封裝組件利器之$attrs、$listeners使用的相關(guān)資料,需要的朋友可以參考下2021-12-12vue中v-model如何綁定多循環(huán)表達(dá)式實(shí)戰(zhàn)案例
v-model綁定的變量無論是對(duì)象還是數(shù)組都是綁定的value值,下面這篇文章主要給大家介紹了關(guān)于vue中v-model如何綁定多循環(huán)表達(dá)式的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11vue 2.1.3 實(shí)時(shí)顯示當(dāng)前時(shí)間,每秒更新的方法
今天小編就為大家分享一篇vue 2.1.3 實(shí)時(shí)顯示當(dāng)前時(shí)間,每秒更新的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09