详解如何将 Vue-cli 改造成支持多页面的 history 模式


Posted in Javascript onNovember 20, 2017

标题可能描述不准确, 大概就是这么个需求:

用 Vue-cli 搭建一个多入口, 多页面的站点, 也就是通过html-webpack-plugin插件会生成多个 .html 文件, 在默认下, 是只有 index.html 这个入口可以用 history 模式, 如: http://www.xxx.com/xxx/xxx, 而其他的入口只能用 hash 模式, 如: http://www.xxx.com/admin.html#/xxx/xxx, 因为webpack-dev-middleware会将所有的路由都指向 index.html 文件, 假如线上的时候, 都需要 history 模式, 这样多少会造成麻烦.

真是太二了, 刚写完文章就发现connect-history-api-fallback这个插件就是做这个的...

方法更新如下:

修改 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'}, // 默认入口
    { from: /\/backend/, to: '/backend.html'}, // 其他入口
    { from: /^\/backend\/.*$/, to: '/backend.html'},
  ]
}))

具体规则就参考: https://github.com/bripkens/connect-history-api-fallback

-------------- 以下代码请无视 --------------

下面我们就来改造下, 让所有入口都支持 history 模式:

1. 首先, 我们在 build 目录下建立个 setup-dev-server.js 文件, 里面代码如下:

const path = require('path')
const webpack = require('webpack')
const clientConfig = require('./webpack.dev.conf') // 引入开发环境下的 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)
  // 关键代码开始
  // 因为开发环境下, 所有的文件都在内存里, 包括由 html-webpack-plugin 生成的 .html 文件, 所以我们需要用 webpack-dev-middleware 提供的 api 从内存里读取
  clientCompiler.plugin('done', () => {
    const fs = devMiddleware.fileSystem // 访问内存
    const filePath = path.join(clientConfig.output.path, 'index.html') // 读取的文件, 文件名和 html-webpack-plugin 生成的文件名要求一致
    if (fs.existsSync(filePath)) { // 判断下文件是否存在
      const index = fs.readFileSync(filePath, 'utf-8') // 从内存里取出
      opts.indexUpdated(index) // 将取出的文件通过 indexUpdated 函数返回, 这个函数怎么来的, 后面会说明
    }
    const adminPath = path.join(clientConfig.output.path, 'backend.html') // 同上, 这是第二个入口生成的 .html 文件, 如果还有其他入口, 这个多复制几份
    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)
  // 当修改 html-webpack-plugin 模版时, 自动刷新整个页面
  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

// 引用前面创建的文件, 并将两个保存内容的函数传过去, 这里保存内容的变量写成对象或者数组也可以, 还可以少点代码
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))
})
// 设置静态文件夹路由
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 页面
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 开始愉快的写代码吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中window.open()的所有参数详细解析
Jan 09 Javascript
再谈Jquery Ajax方法传递到action(补充)
May 12 Javascript
node.js中的querystring.stringify方法使用说明
Dec 10 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
May 03 Javascript
React Native如何消除启动时白屏的方法
Aug 08 Javascript
js使用highlight.js高亮你的代码
Aug 18 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
vue中post请求以a=a&b=b 的格式写遇到的问题
Apr 27 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
Aug 29 Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 #Javascript
Three.js开发实现3D地图的实践过程总结
Nov 20 #Javascript
jquery ztree实现右键收藏功能
Nov 20 #jQuery
深入理解vuex2.0 之 modules
Nov 20 #Javascript
three.js中文文档学习之如何本地运行详解
Nov 20 #Javascript
AngularJS实现自定义指令及指令配置项的方法
Nov 20 #Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 #Javascript
You might like
PHP 正则表达式常用函数
2014/08/17 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
js实现蒙版效果
2020/01/11 Javascript
js实现select下拉框选择
2020/01/11 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python实现飞行棋游戏
2020/02/05 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
python import 上级目录的导入
2020/11/03 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
留学推荐信写作指南
2014/01/25 职场文书
双语教学实施方案
2014/03/23 职场文书
《将心比心》教学反思
2014/04/08 职场文书
转让协议书范本
2014/04/15 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
党校学习党性分析材料
2014/12/19 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python