vue3+ts+nginx部署探索

工程信息

  • vue-cli: @vue/cli 4.5.13
  • vue3 : "version": "3.1.4",
  • ts: <script lang='ts' setup> 模式 (後改爲普通模式)
  • vue-router: "version": "4.0.10",
  • vuex: "version": "4.0.2"

根路徑部署

也就是整個資源部署到 / 根路徑下

打包

npm run build

生成dist目錄

image-20210805105652849

nginx配置

server {
    listen       7002;
    server_name  localhost;

    # 訪問 http://localhost:7002
    location / {
        alias /path/to/demo-vue3-ts-mobile/dist/;
        index  index.html;
        try_files $uri $uri/ /index.html;  
    }

    location /api/ {
        proxy_pass http://localhost:3000/;        
    }    

}

問題1 頁面空白

image-20210805105621293

解決1

網上搜索:"vue3 打包 頁面空白"

網上有人遇到:將vue-router的mode,從history改爲hash

我這邊不管用,還是空白,放棄

import { createRouter, createWebHistory, createWebHashHistory, RouteRecordRaw } from 'vue-router'
const router = createRouter({
  // history: createWebHistory(process.env.BASE_URL),
  history: createWebHashHistory(),
  routes
})

定位問題

@app.vue 新增一段內容

<template>
  app test
  <router-view/>
</template>

打包後,"app test" 顯示, router-view 內容沒有顯示
=》 因此問題出在vue-router加載上

將沒有問題的route配置進行替換,依然空白
=》router配置沒有問題

將home.vue文件的setup模式去除,改爲普通模式
重新打包後,頁面竟然可以了!!!
=》 setup模式導致的

// setup模式
<script lang="ts" setup>
import Test21 from '@/components/test2.mobile.vant/test1.vue'
</script>
// 普通ts模式
<script lang="ts">
// mobile + vant
import Test21 from '@/components/test2.mobile.vant/test1.vue'

import { defineComponent,PropType } from "vue";
export default defineComponent({
  components:{
    Test11, Test12, Test13,
    Test21
  }
})
</script>

解決2

雖然知道原因了,推論應該是script setup 這個語法打包沒有解析成功
檢查tsconf.json 沒有發現問題
檢查vue.config.js 沒有發現問題

搜索: "vue setup 語法 空白"
https://github.com/vuejs/vue-cli/issues/6282

這裏找到一個答案: npm install vue-loader --dev

運行之後:打包頁面正常了

查看package.json新增

  • "vue-loader": "^15.9.8",

查看package-lock.json看到

  • 新增vue-loader-v16
  • 之前本身就有vue-loader(15.9.3)
    "vue-loader": {
      "version": "15.9.3",
    }
    "vue-loader-v16": {
        "version": "npm:[email protected]",
    }

非根路徑部署

也就是整個資源部署到 /pfx 路徑下
有時1臺ng可能會部署多個生產環境,通過前綴區分,比如/pfx1 /pfx2

// vue.config.js 非根路徑部署 
publicPath: process.env.NODE_ENV === "development" ? "/" : "/pfx/" , // 默認 '/'
outputDir: 'pfx', // 默認是 'dist'
# not-working!! 
location /pfx {
    alias /path/to/demo-vue3-ts-mobile/pfx/;
    index  index.html;
    try_files $uri $uri/ /pfx/index.html;  
}

結果
測試過程出現同樣的問題,頁面空白,資源沒有404,控制沒有報錯
這次是真的不知道怎麼辦了!! [掩面哭泣.png]
🙋有人知道怎麼解決嗎?

和之前同樣的方式發現還是 script-setup模式的原因導致的
需要改爲普通模式,重新打包,一切正常!!!
然鵝,本人更喜歡script-setup模式,語法更加簡明

<script lang='ts' setup>
</script>
// 改爲
<script lang='ts'>
</script>

非根嵌套路徑部署

比如路由:

其中:

  • pfx是Nginx設置的路由前綴(production模式纔有,development模式沒有)
  • task/list 等是vue-router內部路由嵌套

沒有遇到什麼問題

// 路由嵌套配置
const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: () => import(/* webpackChunkName: "home" */ '../views/Home.vue')
  },{
    path: '/task',
    component: BaseLayout,
    children:[
      {
        path: 'list',
        name: 'TaskList',
        component: () => import(/* webpackChunkName: "tasklist" */ '../views/task/list.vue')
      },{
        path: 'result',
        name: 'TaskResult',
        component: () => import(/* webpackChunkName: "taskresult" */ '../views/task/result.vue')
      }
    ]
  },
]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章