前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过Node.js完美解决Vue-Cli3.0上线时的二大痛点

通过Node.js完美解决Vue-Cli3.0上线时的二大痛点

作者头像
用户1272076
发布2019-05-10 11:02:39
1.3K0
发布2019-05-10 11:02:39
举报
文章被收录于专栏:张培跃张培跃

在前端框架的历史中,React 和 Angular 一直都处于主角的位置。其间,有众多的新框架试图冲杀进来分一杯羹,但都未成功,除了 Vue。

作为一个比 React 和 Angular 都更年轻的框架,Vue 自打去年在GitHub上的star数量超过React之后,其势如破竹的增长势头好像一直就未曾停歇过!

Vue 有一个与React 的 create-react-app 非常相似的官方CLI 工具:Vue CLI 。Vue CLI 为新开发的应用程序提供了脚手架。

当然,这里标题所说的痛点并非是 Vue CLI 的缺点,而是将通过Vue CLI 开发完工的项目,在放置于Node服务中之前,所需要考虑的两件事情!


一、路由history模式,打包之后运行找不到页面

大家都知道vue-router旗下有 hash 与 history两种模式。两者的区别:一丑!一俊!

history俊归俊,但history外表的洒脱并没有小伙伴们所想象的那么潇洒!

因为我们一旦将项目打完包并让其正式开工干活时,你会发现浏览器刷新时居然会找不到地址,没错!是找不到地址!这哪里还有俊的痕迹?

原因:URL 匹配不到任何静态资源。

解决方法:通过重写URL的方式对服务器进行配置,将匹配不到的URL,全部指向app所依赖的页面:index.html。

解决步骤:

1、下载依赖包:connect-history-api-fallback

代码语言:javascript
复制
cnpm install connect-history-api-fallback -S

2、server.js代码:

代码语言:javascript
复制

const express = require("express");
const history = require("connect-history-api-fallback");
const app = express();
app.use(history({
    // index:"index.html",->index属性默认值为指向index.html
    htmlAcceptHeaders: ['text/html', 'application/xhtml+xml']
}));
app.use(express.static(__dirname+"/dist"));
app.listen(80,function () {
    console.log("success");
});

3、目录结构:


二、proxy代理跨域请求只有在生产环境中有效

proxy在vue-cli3.0以上,可以通过修改vue.config.js来配置,例如:

代码语言:javascript
复制
module.exports = {
    devServer:{
        proxy:{
            "/zhang":{
                target:"http://www.zhangpeiyue.com",
                changeOrigin:true,
                pathRewrite:{
                    "^/zhang":"/"
                }
            }
        }
    }
}

以上设置,在开发环境中能实现跨域获取接口数据。但是打包后在生产环境接口会报错404!

原因:打包以后生成的是一堆静态资源,哪里还会有proxy的身影?

解决方法:通过Node.js在生产环境中实现proxy。

具体步骤:

1、下载依赖包:http-proxy-middleware

代码语言:javascript
复制
// 用于把请求代理转发到其他服务器的中间件。
cnpm install http-proxy-middleware -S

2、server.js代码:

代码语言:javascript
复制
const express = require("express");
const proxy = require("http-proxy-middleware");
const app = express();
app.use("^/zhang",proxy({
    target:"http://www.zhangpeiyue.com",
    changeOrigin:true,
    pathRewrite:{
        "^/zhang":"/"
    }
}))
app.use(express.static(__dirname+"/dist"));
app.listen(80,function () {
    console.log("success");
})

最后奉上server.js完整代码:

代码语言:javascript
复制
const express = require("express");
const proxy = require("http-proxy-middleware");
const history = require("connect-history-api-fallback")
const app = express();
// 解决history问题
app.use("^/zhang",proxy({
    target:"http://www.zhangpeiyue.com",
    changeOrigin:true,
    pathRewrite:{
        "^/zhang":"/"
    }
}))
// 解决proxy问题
app.use(history(
    {
        // index:"index.html",->index属性默认值为指向index.html
        htmlAcceptHeaders: ['text/html', 'application/xhtml+xml']
    }
));
app.use(express.static(__dirname+"/dist"));
app.listen(80,function () {
    console.log("success");
})

—————END—————

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 张培跃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、proxy代理跨域请求只有在生产环境中有效
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档