Vite + Vue3 + Ts は、パッケージ化によって発生する index.html ページの空白表示、リソースのクロスドメイン レポート、リソースが見つからない、404-Page Not Found などのエラーを解決します。

問題の説明:

Vue3 + Ts を使用してプロジェクト開発と Vite 経由でのビルドとパッケージングを行った後、ローカル ファイル システムでパッケージ化してアクセスした後、dist ディレクトリにある index.html ファイルを直接開くと、ブラウザ ページが空白になり、コンソールを開いた後、エラーが報告され、対応するファイルがこのパスに見つかりません。

理由 1:

index.html ファイルで、参照された関連リソース ファイルのパスが正しくないため、ファイル リソースの読み込みに失敗します。これは、ほとんどの開発プロセスで、この静的リソース参照のデフォルトの読み込みプレフィックスが「/」であるためです。
ここに画像の説明を挿入

解決:

プロジェクトのルート ディレクトリにある vite.config.ts ファイルを開き、そのようなファイルがない場合は、手動で作成し (実際には、Vue2.x の vue.config.js に似ています)、静的リソース ベース パスを設定します。 「base」項目に:ヌル文字:「 」、または:「./」、または process.env.NODE_ENV 変数による環境条件判定を設定するか、[ロードしたファイルの開始パスをカレントに設定(およびindex.html) 同レベル) パス].

注: プロジェクトがドメイン名の下のサブディレクトリにある場合、base アイテムの値は、対応するサブディレクトリのディレクトリ名です! !
例: プロジェクトはドメイン名の下の h5 ディレクトリにあり、ベースは「/h5/」です。

import {
    
     defineConfig } from 'vite'
import {
    
     resolve } from 'path'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
    
    
  plugins: [
    vue(),
  ],

  // 静态资源基础路径 base: './' || '',
  base: process.env.NODE_ENV === 'production' ? './' : '/',

  alias: {
    
    
    // 配置目录别名
    '@': resolve(__dirname, 'src'),
    'views': resolve(__dirname, 'src/views'),
    'utils': resolve(__dirname, 'src/utils'),
  },

  css: {
    
    
    // css预处理器
    preprocessorOptions: {
    
    
      less: {
    
    
        modifyVars: {
    
    
          // 全局less变量存储路径(配置less的全局变量)
          hack: `true; @import (reference) "${
      
      resolve('src/public/config.less')}";`,
        },
        javascriptEnabled: true,
      }
    }
  },

  // 开发服务器配置
  server: {
    
    
    host: true,
    open: true,
    port: 3000,
    proxy: {
    
    
      '/api': {
    
    
        target: '//www.xxxx.com',
        changeOrigin: true,
        ws: true,
        secure: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
      }
    }
  },
})

理由 2:

Vite は従来のモジュール システム用に設計されていないため、デフォルトの出力<script type=module>はファイル (js モジュール、css ファイルなど) をロードしてアクセスするための type="module" の ES モジュールです。
次に例を示します。

  <script type="module">
  	 // 在type="module"模式下,可以在Web开发时直接以ES6+的模块化的方式来导入js资源模块。
  	 	// 引入本地js资源模块方式
		import {
     
      createApp } from './script/vue.js';
	 	// 引入网络js资源模块方式 【注:Node.js中的引入是不支持这种网络请求哦!!】
		import {
     
      createApp } from 'https://www.xxx.com/vue.js';
		
		const app = createApp({
     
     ...});
  </script>

ただし、上記の type="module" 形式の JS コードは、ブラウザ内のファイル システムの形式でアクセスして実行することはできません。!
ここに画像の説明を挿入

解決:

<script type="module" crossorigin="" src="./assets/xxx..js"></script>ほとんどのブラウザーは type="module" メソッド、つまり ( ) を使用してブラウザーで js ファイルに直接アクセスすることをサポートしていないため、これは欠陥です。このモジュラー メソッドは、HTTP サーバー環境でアクセスする必要があります。プロジェクトをローカルで参照するには、HTTP サービス環境を構築することもできます。
いくつかのサードパーティ ツールを使用して、サービス環境をすばやく構築できます。一般的な HTTP サービス ツールは次のとおりです。

ソフトウェア クラス:

ブラウザ アプリケーション (プラグイン) クラス:

コマンド ライン ツール クラス:

上記のツールのいずれもインストールしていない場合は、コマンド ライン ツールでコマンドを実行するだけで、インストールして使用するのに非常に便利な live-server または http-server をここで使用することをお勧めします。

/**
* 以下服务工具二选一即可!!
*/

// 全局安装live-server
npm install -g live-server

// 全局安装http-server
npm install -g http-server

// 启动HTTP服务:
	1、在打包生成后的dist目录下,打开命令行工具
	2、执行如下命令:
	
		live-server // 启动HTTP服务
	或
		http-server // 启动HTTP服务

拡大:

問題の説明:

上記の問題を問題なく解決して実稼働環境の起動を開始すると、起動の完了後に次の問題が発生する可能性があります。

  1. ページには通常どおりアクセスして閲覧できますが、クリックして別のページ ルートにジャンプしたり、ページを更新したりすると、404 - ページが見つかりませんという問題が報告されます。!

  2. ドメイン名でしかページが正常に開けないため、ドメイン名の後ろに/index.htmlを付けると(https://www.xxx.com/index.htmlなど)、ページが見つからず表示できません! !

解決:

1. ルーティング モードを変更する

vue-router のルーティング モードを createWebHistory() から createWebHashHistory() に変更します。

import {
    
     createRouter, createWebHistory, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import Home from '../views/Home.vue'

const routes: Array<RouteRecordRaw> = [
    {
    
    
        path: '/',
        name: 'Home',
        component: Home,
    },
    {
    
    
        path: '/about',
        name: 'About',
        // route level code-splitting
        // this generates a separate chunk (about.[hash].js) for this route
        // which is lazy-loaded when the route is visited.
        component: () => import(/* webpackChunkName: "about" */ '../views/About.vue'),
    },
];

const router = createRouter({
    
    
    // history: createWebHistory(import.meta.env.VITE_BASE_PATH as string),
    
    history: createWebHashHistory(import.meta.env.VITE_BASE_PATH as string), // 改为这种HASH路由模式

    routes,
});

export default router;

2. サーバー構成を変更する

本番サーバーに対応する構成ファイルを変更します。
1. Nginx サーバー構成


# 在Nginx服务器的conf/nginx.conf配置文件中添加如下代码即可
 
location / {
    
    
    try_files $uri $uri/ /index.html;
}
 
# 注:修改后nginx.conf配置文件后,一定要重启nginx服务,配置才能生效!

2.Apache サーバーの構成


<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{
    
    REQUEST_FILENAME} !-f
  RewriteCond %{
    
    REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

3. IIS サーバーの構成


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="AngularJS" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          //将url中的参数设为 "/" 或者 "/index.html" 
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

おすすめ

転載: blog.csdn.net/muguli2008/article/details/122306515