詳解如何將 Vue-cli 改造成支持多頁(yè)面的 history 模式
標(biāo)題可能描述不準(zhǔn)確, 大概就是這么個(gè)需求:
用 Vue-cli 搭建一個(gè)多入口, 多頁(yè)面的站點(diǎn), 也就是通過(guò)html-webpack-plugin插件會(huì)生成多個(gè) .html 文件, 在默認(rèn)下, 是只有 index.html 這個(gè)入口可以用 history 模式, 如: http://www.xxx.com/xxx/xxx, 而其他的入口只能用 hash 模式, 如: http://www.xxx.com/admin.html#/xxx/xxx, 因?yàn)閣ebpack-dev-middleware會(huì)將所有的路由都指向 index.html 文件, 假如線上的時(shí)候, 都需要 history 模式, 這樣多少會(huì)造成麻煩.
真是太二了, 剛寫完文章就發(fā)現(xiàn)connect-history-api-fallback這個(gè)插件就是做這個(gè)的...
方法更新如下:
修改 build/dev-server.js 文件
app.use(require('connect-history-api-fallback')())
改成
var history = require('connect-history-api-fallback') app.use(history({ rewrites: [ { from: 'index', to: '/index.html'}, // 默認(rèn)入口 { from: /\/backend/, to: '/backend.html'}, // 其他入口 { from: /^\/backend\/.*$/, to: '/backend.html'}, ] }))
具體規(guī)則就參考: https://github.com/bripkens/connect-history-api-fallback
-------------- 以下代碼請(qǐng)無(wú)視 --------------
下面我們就來(lái)改造下, 讓所有入口都支持 history 模式:
1. 首先, 我們?cè)?build 目錄下建立個(gè) setup-dev-server.js 文件, 里面代碼如下:
const path = require('path') const webpack = require('webpack') const clientConfig = require('./webpack.dev.conf') // 引入開(kāi)發(fā)環(huán)境下的 webpack 配置文件 module.exports = function setupDevServer(app, opts) { const clientCompiler = webpack(clientConfig) // 加載 webpack-dev-middleware 插件 const devMiddleware = require('webpack-dev-middleware')(clientCompiler, { publicPath: clientConfig.output.publicPath, stats: { colors: true, chunks: false } }) app.use(devMiddleware) // 關(guān)鍵代碼開(kāi)始 // 因?yàn)殚_(kāi)發(fā)環(huán)境下, 所有的文件都在內(nèi)存里, 包括由 html-webpack-plugin 生成的 .html 文件, 所以我們需要用 webpack-dev-middleware 提供的 api 從內(nèi)存里讀取 clientCompiler.plugin('done', () => { const fs = devMiddleware.fileSystem // 訪問(wèn)內(nèi)存 const filePath = path.join(clientConfig.output.path, 'index.html') // 讀取的文件, 文件名和 html-webpack-plugin 生成的文件名要求一致 if (fs.existsSync(filePath)) { // 判斷下文件是否存在 const index = fs.readFileSync(filePath, 'utf-8') // 從內(nèi)存里取出 opts.indexUpdated(index) // 將取出的文件通過(guò) indexUpdated 函數(shù)返回, 這個(gè)函數(shù)怎么來(lái)的, 后面會(huì)說(shuō)明 } const adminPath = path.join(clientConfig.output.path, 'backend.html') // 同上, 這是第二個(gè)入口生成的 .html 文件, 如果還有其他入口, 這個(gè)多復(fù)制幾份 if (fs.existsSync(adminPath)) { const admin = fs.readFileSync(adminPath, 'utf-8') opts.adminUpdated(admin) } }) // 加載熱重載模塊 app.use(require('webpack-hot-middleware')(clientCompiler)) var hotMiddleware = require('webpack-hot-middleware')(clientCompiler) // 當(dāng)修改 html-webpack-plugin 模版時(shí), 自動(dòng)刷新整個(gè)頁(yè)面 clientCompiler.plugin('compilation', function(compilation) { compilation.plugin('html-webpack-plugin-after-emit', function(data, cb) { hotMiddleware.publish({ action: 'reload' }) cb() }) }) }
2. 修改 build/dev-server.js 文件
主要修改文件中var app = express()到module.exports = app.listen(port, function (err) {之間的代碼
var app = express() var indexHTML var adminHTML // 引用前面創(chuàng)建的文件, 并將兩個(gè)保存內(nèi)容的函數(shù)傳過(guò)去, 這里保存內(nèi)容的變量寫成對(duì)象或者數(shù)組也可以, 還可以少點(diǎn)代碼 require('../config/setup-dev-server')(app, { indexUpdated: index => { indexHTML = index }, adminUpdated: index => { adminHTML = index }, }) // 加載反向代理 Object.keys(proxyTable).forEach(function(context) { var options = proxyTable[context] if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(context, options)) }) // 設(shè)置靜態(tài)文件夾路由 var staticPath = path.posix.join(config.assetsPublicPath, config.assetsSubDirectory) app.use(staticPath, express.static('./static')) // 入口1路由 app.get(['/', '/category/:id'], (req, res) => { res.send(indexHTML) }) // 入口2路由 app.get(['/backend', '/backend/*'], (req, res) => { res.send(adminHTML) }) // 404 頁(yè)面 app.get('*', (req, res) => { res.send('HTTP STATUS: 404') }) app.use(function(req, res, next) { var err = new Error('Not Found') err.status = 404 next(err) }) app.use(function(err, req, res) { res.status(err.status || 500) res.send(err.message) }) module.exports = app.listen(port, function(err) {
3. npm run dev 開(kāi)始愉快的寫代碼吧
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue webpack 項(xiàng)目自動(dòng)打包壓縮成zip文件的方法
這篇文章主要介紹了Vue -- webpack 項(xiàng)目自動(dòng)打包壓縮成zip文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Vue3除了keep-alive還有哪些實(shí)現(xiàn)頁(yè)面緩存詳解
Vue3中的keep-alive組件用于緩存頁(yè)面,以便在切換頁(yè)面時(shí)保留其狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Vue3除了keep-alive還有哪些實(shí)現(xiàn)頁(yè)面緩存的相關(guān)資料,需要的朋友可以參考下2024-04-04uniapp微信小程序WebApi_openid、phone接口獲取代碼詳解
本文主要記錄了微信小程序接口調(diào)用的過(guò)程,首先查看uniapp文檔和微信API文檔,獲取openid和phone,然后通過(guò)uniapp實(shí)現(xiàn)獲取openid和電話號(hào)碼,但遇到了合法域名屏蔽的問(wèn)題,最后通過(guò)將微信訪問(wèn)遷移到后臺(tái)解決,需要的朋友可以參考下2024-10-10vue3實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的示例代碼
這篇文章給大家介紹了vue3如何實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02Element-ui的table中使用fixed后出現(xiàn)行混亂情況的解決
這篇文章主要介紹了Element-ui的table中使用fixed后出現(xiàn)行混亂情況的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue+animation實(shí)現(xiàn)翻頁(yè)動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了vue+animation實(shí)現(xiàn)翻頁(yè)動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06el-form錯(cuò)誤提示信息手動(dòng)添加和取消的示例代碼
這篇文章主要介紹了el-form錯(cuò)誤提示信息手動(dòng)添加和取消,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08vue中實(shí)現(xiàn)滾動(dòng)加載更多的示例
下面小編就為大家?guī)?lái)一篇vue中實(shí)現(xiàn)滾動(dòng)加載更多的示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Vue3使用element-plus實(shí)現(xiàn)彈窗效果
本文主要介紹了Vue3使用element-plus實(shí)現(xiàn)彈窗效果,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07