Vue多页面应用与Nginx

npm run build 之后将dist放到Nginx目录就行?

再多几个需求就不简单了:

  • 支持VueRouter History模式
  • 多页面入口
  • 部署在子目录, 如 www.example.com/app/

提示: 此文档基于的环境是: vue-cli 3.0 与 vue 2.6.

一步一步来

将多个页面部署在域名根目录

假如 我们项目有两个入口: pc 与 mobile, 我们需要修改 这几个地方:

  • vue.config.js: 配置多页面
  • router.js: 配置base
  • nginx.conf: 配置支持RouterHistory模式

vue.config.js

按照vue-cli的官方文档配置多入口并不难:

module.exports = {
  pages: {
    'index': {
      entry: 'src/pages/pc/index.js',
      template: 'src/pages/pc/index.html',
      filename: 'index.html',
    },
    'mobile': {
      entry: 'src/pages/mobile/index.js',
      template: 'src/pages/mobile/mobile.html',
      filename: 'mobile/index.html',
    }
  },

页面入口名字 即mobile只会影响在开发环境的入口: 现在需要使用 'localhost:3000/index' 和或者 'localhost:3000' 来进入index页面, 使用 'localhost:3000/mobile' 来进入 mobile 页面.

filename会影响在生产环境中打包出来的入口文件(.html文件)路径. 值得注意的是 mobile.filename 字段: 我设置的是 mobile/index.html, 而不是 mobile.html, 这是有原因的, 在下面配置nginx时会说到.

router.js

配置好vue.config.js之后打开 'localhost:3000/mobile' 却发现空白, 进入不了mobile的路由.

查文档 VueRouterApi-base, 发现需要配置 base.

base: 应用的基路径。例如,如果整个单页应用服务在 /app/ 下,然后 base 就应该设为 "/app/"。

官方文档只是举了一个例子说部署在/app/下可以设置base, 但多页面也需要如此配置.

如下:

mobile.router.js

export default new Router({
  mode: 'history',
  base: '/mobile/',
  routes: [
    {
      path: '/',
      name: 'index',
      component: Home
    },
  ]
})

现在访问 localhost:3000/mobile 就能正常进入.

至此, 开发环境没问题了. 接下来是部署.

nginx.conf

我使用nginx作为web容器部署前端项目, 其他服务器大同小异.

我们需要将npm run build打包出来的dist文件夹下的所有文件放置到nginx所在服务器的/usr/share/nginx/html目录下. (目录可以自定义)

nginx.conf

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;

    location / {
        # vue router mode 为 history 时美化url
        try_files $uri $uri/ /index.html;
    }
}

其中为了支持VueRouter的History模式, 我们需要按照官方文档配置: HTML5 History 模式.

又得益于我们将mobile入口的输出文件地址修改为了 mobile/index.html, 正好访问 /mobile/ 时让Nginx打开mobile/index.html文件, 所以它足够简单.

如果你只有需求将项目部署在根目录, 那么现在便完成了.

将多个页面部署在子目录

假如需要将项目放入 www.example.com/app/ 下, 访问www.example.com/app/进入index入口, 访问www.example.com/app/mobile进入mobile入口. 则在上述 ‘部署到根目录’ 基础之上还需要修改以下几项文件:

  • vue.config.js: 配置多页面入口, 打包出来的文件路径.
  • router.js: 配置base

vue.config.js

module.exports = {
  publicPath: '/app/', // modified
  outputDir: 'dist/app', // modified
  pages: {
    'app/index': { // modified
      entry: 'src/pages/pc/index.js',
      template: 'src/pages/pc/index.html',
      filename: 'index.html',
    },
    'app/mobile': { // modified
      entry: 'src/pages/mobile/index.js',
      template: 'src/pages/mobile/mobile.html',
      filename: 'mobile/index.html',
    }
  }

pages中需要修改的是 两个入口名字, 修改为: app/indexapp/mobile.

在上面说了, 页面入口名字 即app/mobile只会影响到开发环境访问入口: 现在在开发环境访问localhost/app/mobile才能进入mobile页面.

如果我们需要在生产模式也使用domain/app/mobile路径访问项目, 还需要修改: publicPathoutputDir

  • publicPath: 指定在html模板中注入的打包出来的静态文件路径, 亦可实现将打包出的静态文件上传到CDN.
  • outputDir: 打包出的文件地址, 默认是dist, 我们需要修改为dist/app, 表示所有文件都存放在dist/app文件夹下.

更多请查阅文档: publicpath, outputdir.

router.js

修改base, 如下:

mobile.router.js

export default new Router({
  mode: 'history',
  base: '/app/mobile/', // modified
  routes: [
    {
      path: '/',
      name: 'index',
      component: Home
    },
  ]
})

QA

Q: 为什么不用 Nginx 的alias指令来实现子目录, 而是通过修改outputDir参数?

A: 修改outputDir是为了不修改nginx配置. 不修改outputDir也是可行的, 那么需要修改nginx配置如下:

   location /app {
       alias /usr/share/nginx/html;
       ...
   }

少改一个文件是一个, 所以我推荐修改 outputDir .

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345