【Vue3+TSプロジェクト】シリコンバレー選考day02 ~バックグラウンド管理システムテンプレート構築・プロジェクト構成~

1 プロジェクトの初期化

プロジェクトには統一された仕様が必要です。コードの品質を検出して修復するにはeslint+stylelint+prettier を使用する必要があります。コミット インターセプトには husky を使用する必要があります。送信仕様を統一するには commitlint を使用する必要があります。パッケージ管理ツールを統合するためにプレインストールします

1.1 環境の準備

  • ノードv16.14.2

  • pnpm 8.0.0

1.2 プロジェクトの初期化

このプロジェクトは vite を使用してビルドします。vite 公式中国語ドキュメント参照: cn.vitejs.dev/guide/

pnpm:パフォーマンス npm、「高性能 npm」を​​意味します。npm/yarn から派生した pnpm は、npm/yarn 内の潜在的なバグを解決し、パフォーマンスを大幅に最適化し、使用シナリオを拡張します。「最も先進的なパッケージ管理ツール」として宣伝される

pnpm のインストール手順:

npm i -g pnpm

プロジェクト初期化コマンド:

pnpm create vite

プロジェクトのルート ディレクトリpnpm installに入力してすべての依存関係をインストールし、依存関係をインストールした後でプログラムを実行します: pnpm run dev

実行後、プロジェクトはhttp://127.0.0.1:5173/で実行され、プロジェクトにアクセスできます。

発生する可能性のある問題

 モジュール「./App.vue」またはそれに対応する型宣言が見つかりません

エラーの理由: typescript は .ts ファイルのみを理解できますが、.vue ファイルは理解できません。

解決策 1: volar プラグインをインストールし、「volar」と入力します。拡張機能は複数ありますが、機能するのは Typescript Vue Plugin (Volar) です。

vscode は vue3 を検出する前に、Vue 言語機能 (Volar) のインストールを自動的に推奨していましたが、型エラーがスローされました。競合を避けるために、使用する場合は Vetur を無効にすることが公式に推奨されています。

解決策 2: vite プロジェクトを作成した後、プロジェクトのルート ディレクトリに「env.d.ts」ファイルが存在します。そのファイルを見つけて、そのファイルにコードを追加します。

declare module "*.vue" {
  import { DefineComponent } from "vue"
  const component: DefineComponent<{}, {}, any>
  export default component
}

ちょっとしたヒント: 効率を向上させるためにブラウザが自動的に開きます。

package.json ファイルに追加する--open

"scripts": {
  "dev": "vite --open",
  "build": "vue-tsc && vite build",
  "preview": "vite preview"
},

これは機能しないことがわかりました。(私の Vue2 プロジェクトのブラウザを自動的に開く設定を参照できます)

2プロジェクト構成

1、eslint 構成

eslint 中国語公式ウェブサイト: ESLint - Pluggable JavaScript リンター - ESLint 中国語

ESLint はもともと、2013 年 6 月にNicholas C. Zakasによって作成されたオープンソース プロジェクトでした その目標は、プラグインJavaScript コード検出ツールを提供することです。

まずはeslintをインストール

pnpm i eslint -D

構成ファイルの生成: .eslint.cjs

npx eslint --init

.eslint.cjs 構成ファイル

module.exports = {
   // 运行环境
    "env": { 
        "browser": true,// 浏览器端
        "es2021": true,// es2021
    },
    //规则继承
    "extends": [ 
       //全部规则默认是关闭的,这个配置项开启推荐规则,推荐规则参照文档
       //比如:函数不能重名、对象不能出现重复key
        "eslint:recommended",
        //vue3语法规则
        "plugin:vue/vue3-essential",
        //ts语法规则
        "plugin:@typescript-eslint/recommended"
    ],
    //要为特定类型的文件指定处理器
    "overrides": [
    ],
    //指定解析器:解析器
    //Esprima 默认解析器
    //Babel-ESLint babel解析器
    //@typescript-eslint/parser ts解析器
    "parser": "@typescript-eslint/parser",
    //指定解析器选项
    "parserOptions": {
        "ecmaVersion": "latest",//校验ECMA最新版本
        "sourceType": "module"//设置为"script"(默认),或者"module"代码在ECMAScript模块中
    },
    //ESLint支持使用第三方插件。在使用插件之前,您必须使用npm安装它
    //该eslint-plugin-前缀可以从插件名称被省略
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    //eslint规则--最重要,需要看官网配置
    "rules": {
    }
}

1.1 Vue3環境コード検証プラグイン

# 让所有与prettier规则存在冲突的Eslint rules失效,并使用prettier进行代码检查
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-node": "^11.1.0",
# 运行更漂亮的Eslint,使prettier规则优先级更高,Eslint优先级低
"eslint-plugin-prettier": "^4.2.1",
# vue.js的Eslint插件(查找vue语法错误,发现错误指令,查找违规风格指南
"eslint-plugin-vue": "^9.9.0",
# 该解析器允许使用Eslint校验所有babel code
"@babel/eslint-parser": "^7.19.1",

インストール手順

pnpm install -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node @babel/eslint-parser

1.2 .eslintrc.cjs 構成ファイルを変更する

// @see https://eslint.bootcss.com/docs/rules/
​
module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
    jest: true,
  },
  /* 指定如何解析语法 */
  parser: 'vue-eslint-parser',
  /** 优先级低于 parse 的语法解析配置 */
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    parser: '@typescript-eslint/parser',
    jsxPragma: 'React',
    ecmaFeatures: {
      jsx: true,
    },
  },
  /* 继承已有的规则 */
  extends: [
    'eslint:recommended',
    'plugin:vue/vue3-essential',
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  plugins: ['vue', '@typescript-eslint'],
  /*
   * "off" 或 0    ==>  关闭规则
   * "warn" 或 1   ==>  打开的规则作为警告(不影响代码执行)
   * "error" 或 2  ==>  规则作为一个错误(代码不能执行,界面报错)
   */
  rules: {
    // eslint(https://eslint.bootcss.com/docs/rules/)
    'no-var': 'error', // 要求使用 let 或 const 而不是 var
    'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允许多个空行
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-unexpected-multiline': 'error', // 禁止空余的多行
    'no-useless-escape': 'off', // 禁止不必要的转义字符
​
    // typeScript (https://typescript-eslint.io/rules)
    '@typescript-eslint/no-unused-vars': 'error', // 禁止定义未使用的变量
    '@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
    '@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 类型
    '@typescript-eslint/no-non-null-assertion': 'off',
    '@typescript-eslint/no-namespace': 'off', // 禁止使用自定义 TypeScript 模块和命名空间。
    '@typescript-eslint/semi': 'off',
​
    // eslint-plugin-vue (https://eslint.vuejs.org/rules/)
    'vue/multi-word-component-names': 'off', // 要求组件名称始终为 “-” 链接的单词
    'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的变量<template>被标记为未使用
    'vue/no-mutating-props': 'off', // 不允许组件 prop的改变
    'vue/attribute-hyphenation': 'off', // 对模板中的自定义组件强制执行属性命名样式
  },
}

1.3 .eslintignore ファイルを無視する

dist
node_modules

1.4 スクリプトの実行

package.json は 2 つの実行スクリプトを追加します

"scripts": {
    "lint": "eslint src", //校验
    "fix": "eslint src --fix", //修复
}

2、より美しく構成する

eslint では、なぜもっときれいにする必要があるのでしょうか? eslint は、js 構文と少数の形式の問題を含む検出ツールである JavaScript を対象としています。eslint の見解では、正しい構文によってコードの正常な動作が保証され、形式の問題は二の次です。

そして、prettier は書式設定ツールです。書式が統一されていないことを理解できないため、eslint がうまくできなかったことを引き続き実行します。

jsを含む多言語対応。

要約すると、eslint と pretty の 2 つの兄弟は、JS コードの品質とコードの美しさを保証します。

2.1 依存パッケージをインストールする

pnpm install -D eslint-plugin-prettier prettier eslint-config-prettier

2.2 .prettierrc.json にルールを追加する

{
  "singleQuote": true,
  "semi": false,
  "bracketSpacing": true,
  "htmlWhitespaceSensitivity": "ignore",
  "endOfLine": "auto",
  "trailingComma": "all",
  "tabWidth": 2
}

2.3 .prettierignore ファイルを無視する

/dist/*
/html/*
.local
/node_modules/**
**/*.svg
**/*.sh
/public/*

pnpm run lintを使用して 文法をチェックし、不規則な形式がある場合は、pnpm run fixを使用して修正します。

3、stylelintの設定

stylelintは CSS 用の lint ツールです。cssコードの整形、cssの構文エラーや無理な記述のチェック、cssの書き込み順の指定などが可能です。

プロジェクトでは scss をプリプロセッサとして使用し、次の依存関係をインストールします。

pnpm add sass sass-loader stylelint postcss postcss-scss postcss-html stylelint-config-prettier stylelint-config-recess-order stylelint-config-recommended-scss stylelint-config-standard stylelint-config-standard-vue stylelint-scss stylelint-order stylelint-config-standard-scss -D

3.1 .stylelintrc.cjs設定ファイル

公式ウェブサイト:ホーム | Stylelint 中国語ドキュメント | Stylelint 中国語ウェブサイト

// @see https://stylelint.bootcss.com/
​
module.exports = {
  extends: [
    'stylelint-config-standard', // 配置stylelint拓展插件
    'stylelint-config-html/vue', // 配置 vue 中 template 样式格式化
    'stylelint-config-standard-scss', // 配置stylelint scss插件
    'stylelint-config-recommended-vue/scss', // 配置 vue 中 scss 样式格式化
    'stylelint-config-recess-order', // 配置stylelint css属性书写顺序插件,
    'stylelint-config-prettier', // 配置stylelint和prettier兼容
  ],
  overrides: [
    {
      files: ['**/*.(scss|css|vue|html)'],
      customSyntax: 'postcss-scss',
    },
    {
      files: ['**/*.(html|vue)'],
      customSyntax: 'postcss-html',
    },
  ],
  ignoreFiles: [
    '**/*.js',
    '**/*.jsx',
    '**/*.tsx',
    '**/*.ts',
    '**/*.json',
    '**/*.md',
    '**/*.yaml',
  ],
  /**
   * null  => 关闭该规则
   * always => 必须
   */
  rules: {
    'value-keyword-case': null, // 在 css 中使用 v-bind,不报错
    'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器
    'function-url-quotes': 'always', // 要求或禁止 URL 的引号 "always(必须加上引号)"|"never(没有引号)"
    'no-empty-source': null, // 关闭禁止空源码
    'selector-class-pattern': null, // 关闭强制选择器类名的格式
    'property-no-unknown': null, // 禁止未知的属性(true 为不允许)
    'block-opening-brace-space-before': 'always', //大括号之前必须有一个空格或不能有空白符
    'value-no-vendor-prefix': null, // 关闭 属性值前缀 --webkit-box
    'property-no-vendor-prefix': null, // 关闭 属性前缀 -webkit-mask
    'selector-pseudo-class-no-unknown': [
      // 不允许未知的选择器
      true,
      {
        ignorePseudoClasses: ['global', 'v-deep', 'deep'], // 忽略属性,修改element默认样式的时候能使用到
      },
    ],
  },
}

3.2 .stylelintignore ファイルを無視する

/node_modules/*
/dist/*
/html/*
/public/*

3.3 スクリプトの実行

"scripts": {
    "lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix"
}

最後に、js と css、html コードをフォーマットするために統合された prettier を構成します。

 "scripts": {
    "dev": "vite --open",
    "build": "vue-tsc && vite build",
    "preview": "vite preview",
    "lint": "eslint src",
    "fix": "eslint src --fix",
    -"format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"",
    -"lint:eslint": "eslint src/**/*.{ts,vue} --cache --fix",
    -"lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix"
  },

pnpm run formatを実行すると、コードは直接フォーマットされます。

私の理解では、会社が今後の作業プロジェクトで成熟したコードスタイルを持っている場合、会社のコードスタイルに従って構成することで、統一されたスタイルを確保し、効率を向上させることができます。生涯利用できるように構成します。

4番目に、ハスキーを設定します

上記のコード検証ツールを統合しましたが、コードをフォーマットするには毎回手動でコマンドを実行する必要があります。誰かがフォーマットせずにリモート リポジトリに送信した場合、この仕様は役に立ちません。したがって、開発者にコード仕様に従って提出するよう強制する必要があります。

これを行うには、コードが送信される前にhusky を使用して git フック (クライアント側の git のフック) をトリガーし、pnpm run format を実行してコードを自動的にフォーマットする必要があります。

インストール husky

pnpm install -D husky

埋め込む

最初に git を使用してウェアハウスを初期化する必要があります

npx husky-init

ルート ディレクトリの下に.huskyディレクトリが生成され、このディレクトリの下にコミット前ファイルが作成されます。コミットを実行すると、このファイル内のコマンドが実行されます。

.husky/pre-commit次のコマンドをファイルに追加します。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm run format //关键

コードをコミットすると、コマンドが実行され、コードがフォーマットされてから送信されます。

5、commitlint を設定する

コミット情報にも統一規格があり、気軽に書くことはできませんが、その統一規格に従って全員が実装できるようにするにはcommitlintを使うことで実現できます。

インストールパッケージ

pnpm add @commitlint/config-conventional @commitlint/cli -D

構成ファイルを追加し、新しいファイルを作成しcommitlint.config.cjs(cjs であることに注意してください)、次のコードを追加します。

module.exports = {
  extends: ['@commitlint/config-conventional'],
  // 校验规则
  rules: {
    'type-enum': [
      2,
      'always',
      [
        'feat',
        'fix',
        'docs',
        'style',
        'refactor',
        'perf',
        'test',
        'chore',
        'revert',
        'build',
      ],
    ],
    'type-case': [0],
    'type-empty': [0],
    'scope-empty': [0],
    'scope-case': [0],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never'],
    'header-max-length': [0, 'always', 72],
  },
}

package.jsonscriptsコマンドを設定します。

# 在scrips中添加下面的代码
{
"scripts": {
    "commitlint": "commitlint --config commitlint.config.cjs -e -V"
  },
}

commit設定は完了しました。情報を入力したら、次のものを用意する必要があります。subject

'feat',//新特性、新功能
'fix',//修改bug
'docs',//文档修改
'style',//代码格式修改, 注意不是 css 修改
'refactor',//代码重构
'perf',//优化相关,比如提升性能、体验
'test',//测试用例修改
'chore',//其他修改, 比如改变构建流程、或者增加依赖库、工具等
'revert',//回滚到上一个版本
'build',//编译相关的修改,例如发布版本、对项目构建或者依赖的改动

ハスキーを構成する

npx husky add .husky/commit-msg 

生成された commit-msg ファイルに次のコマンドを追加します。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm commitlint

投稿情報をコミットする際、自由に書くことはできなくなり、型に合った git commit -m 'fix: xxx' でなければなりません。型の後には English: が続く必要があることに注意してください。コロンは空である必要があります 1 つのグリッド、これは省略できません

6. pnpm パッケージ マネージャー ツールの使用の必須

チームがプロジェクトを開発する場合、異なるパッケージ マネージャー ツールが同じ依存関係をダウンロードし、バージョンが異なる可能性があるため、パッケージ マネージャー ツールを統合する必要があります。

プロジェクトのバグ問題につながるため、パッケージマネージャーツールは統一的に管理する必要があります。

scritps/preinstall.jsルートディレクトリにファイルを作成し、次の内容を追加します

if (!/pnpm/.test(process.env.npm_execpath || '')) {
  console.warn(
    `\u001b[33mThis repository must using pnpm as the package manager ` +
    ` for scripts to work properly.\u001b[39m\n`,
  )
  process.exit(1)
}

設定コマンド

"scripts": {
    "preinstall": "node ./scripts/preinstall.js"
}

npm または Yarn を使用してパッケージをインストールすると、エラーが報告されます。原則として、プリインストール ファイル内のコード (npm によって提供されるライフ サイクル フック) がインストール中にトリガーされるということです。

3 プロジェクトの統合

3.1 要素プラスの統合

シリコンバレーは動作プラットフォームを選択し、UI コンポーネント ライブラリはelement-plusを使用するため、element-plus プラグインを統合する必要があります。

公式 Web サイトのアドレス: Vue 3 UI フレームワーク | Element Plus

@element-plus/icons-vue: はよく使われるアイコン コンポーネント ライブラリです。

pnpm install element-plus @element-plus/icons-vue

エントリ ファイル main.ts は element-plus をグローバルにインストールします。element-plus のデフォルトでサポートされる言語は英語と中国語です

import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
//@ts-ignore  忽略当前文件ts类型的检测否则有红色提示(打包会失败)
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
app.use(ElementPlus, {
    locale: zhCn
})

 

Element Plus グローバル コンポーネント タイプ宣言 --- 無視できます

// tsconfig.json
{
  "compilerOptions": {
    // ...
    "types": ["element-plus/global"]
  }
}

構成後、Element-Plus コンポーネントとアイコンの使用をテストできます。

3.2 srcエイリアスの設定

プロジェクトを開発する際、ファイルとファイルの関係が複雑になることがあるので、srcフォルダーにエイリアスを設定する必要があります!

// vite.config.ts
import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
--import path from 'path'
export default defineConfig({
    plugins: [vue()],
    resolve: {
        alias: {
            "@": path.resolve("./src") // 相对路径别名配置,使用 @ 代替 src
        }
    }
})

TypeScript のコンパイル設定

// tsconfig.json
{
  "compilerOptions": {
    --"baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
    --"paths": { //路径映射,相对于baseUrl
      "@/*": ["src/*"] 
    }
  }
}

vue3 で導入されたサブコンポーネントを使用しない場合、赤線のプロンプトが表示される場合がありますが、動作には影響ありません。これを取り除くには、プラグイン Vetur を無効にすることができます。

3.3 環境変数の設定

プロジェクトの開発プロセスでは、開発環境テスト環境本番環境(正式な環境) という少なくとも3 つの段階を通過します。さまざまな段階(インターフェイス アドレスなど)のリクエストの状態は同じではないため、インターフェイス アドレスを手動で切り替えるのは非常に面倒で、エラーが発生しやすくなります。そこで、環境変数の設定が必要になり、簡単な設定だけを行うだけで、環境状態の切り替え作業はコードに任せることができます

開発環境(development)はその名のとおり、開発して利用するための環境であり、開発者はそれぞれ自分のdevブランチで作業し、開発がある程度のレベルに達したら、仲間がコードをマージして共同デバッグを行います。

テスト環境 (テスト) は、同僚が作業する環境であり、通常はテスト同僚自身によって展開され、この環境でテストされます。

本番環境(本番)本番環境とは外部サービスを正式に提供する環境を指し、通常はエラーレポートはオフ、エラーログはオンになります。(お客様に正式に提供される環境です。)

注: 一般に、環境はサーバーに相当します。一部の企業では、サーバーである開発およびテスト環境を持っています。

開発、運用、テスト環境のファイルをプロジェクトのルート ディレクトリに追加します。

.env.development
.env.production
.env.test

文書の内容

# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV = 'development'
VITE_APP_TITLE = '硅谷甄选运营平台'
VITE_APP_BASE_API = '/api'


NODE_ENV = 'production'
VITE_APP_TITLE = '硅谷甄选运营平台'
VITE_APP_BASE_API = '/prod-api'


# 变量必须以 VITE_ 为前缀才能暴露给外部读取
NODE_ENV = 'test'
VITE_APP_TITLE = '硅谷甄选运营平台'
VITE_APP_BASE_API = '/test-api'

構成実行コマンド: package.json

 "scripts": {
    "dev": "vite --open",
    "build:test": "vue-tsc && vite build --mode test",
    "build:pro": "vue-tsc && vite build --mode production",
    "preview": "vite preview"
  },

import.meta.env を通じて環境変数を取得する

//import.meta.env获取环境变量--任何组件都可以使用
console.log(import.meta.env)
// 比如后面的api接口会使用到这里的基础路径

3.4 SVGアイコンの構成

SVG ベクター グラフィックスはプロジェクトの開発時によく使用されますが、SVG を使用すると、画像リソースがページに読み込まれなくなります。

これにより、ページのパフォーマンスが大幅に向上し、SVG ファイルは img よりもはるかに小さくなり、プロジェクト内のリソースをほとんど消費しません。

SVG 依存関係プラグインをインストールする

pnpm install vite-plugin-svg-icons -D

vite.config.tsプラグインを設定します

import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default () => {
  return {
    plugins: [
      createSvgIconsPlugin({
        // Specify the icon folder to be cached
        iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
        // Specify symbolId format
        symbolId: 'icon-[dir]-[name]',
      }),
    ],
  }
}

エントリーファイルのインポート

import 'virtual:svg-icons-register'

どのコンポーネントでも使いやすい

src/assets に新しいアイコン フォルダーを作成し、必要な SVG アイコンを保存します。

<!-- svg:图标外层容器,内部需要use标签结合使用 -->
<svg>
  <!-- xlink:href执行用哪一个图标,属性值必须加上 #icon-图标名字 -->
  <use xlink:href="#icon-apple" fill="red"></use>
</svg>

3.4.1 svg はグローバル コンポーネントとしてパッケージ化されています

プロジェクトの多くのモジュールはアイコンを使用する必要があるため、グローバル コンポーネントとしてパッケージ化されています。

src/components ディレクトリに SvgIcon コンポーネントを作成します。表現は次のとおりです。

<template>
  <div>
    <svg :style="{ width: width, height: height }">
      <use :xlink:href="prefix + name" :fill="color"></use>
    </svg>
  </div>
</template>
​
<script setup lang="ts">
defineProps({
  //xlink:href属性值的前缀
  prefix: {
    type: String,
    default: '#icon-'
  },
  //svg矢量图的名字
  name: String,
  //svg图标的颜色
  color: {
    type: String,
    default: ""
  },
  //svg宽度
  width: {
    type: String,
    default: '16px'
  },
  //svg高度
  height: {
    type: String,
    default: '16px'
  }
​
})
</script>
<style scoped></style>

src フォルダー ディレクトリにindex.ts ファイルを作成します。これは、コンポーネント フォルダー内のすべてのグローバル コンポーネントを登録するために使用されます。

グローバルコンポーネントをエントリファイルに直接登録すると、100を100回記述する必要があり、多すぎます。カスタムプラグインを通じて

// 引入项目中全部的全局组件
import SvgIcon from '@/components/SvgIcon/index.vue';
​
// 全局组件的对象
const allGlobalComponents = { SvgIcon: SvgIcon };
// 对外暴露一个插件对象
export default {
    install(app) {
        Object.keys(allGlobalComponents).forEach((key) => {
            app.component(key, allGlobalComponents[key]);
        })
    }
}
エントリ ファイルに src/index.ts ファイルを導入し、app.use メソッドを通じてカスタム プラグインをインストールします。
// 引入自定义插件对象:注册全局组件
import globalComponent from '@/components/index.ts'
// 安装自定义插件
app.use(globalComponent)

3.5 統合された Sass

styleLint ツールの設定時に sass sass-loader がプロジェクトにインストールされているため、コンポーネント内で scss スタイルをすでに使用できます。そのため、コンポーネント内で scss 構文を使用できます。lang="scss"を追加する必要があります

<style scoped lang="scss"></style>

次に、いくつかのグローバル スタイルをプロジェクトに追加します。

src/style ディレクトリにindex.scssファイルを作成します。もちろん、プロジェクトはデフォルトのスタイルをクリアする必要があるため、index.scssにreset.scssを導入します。Reset.scss のスタイルは npm で利用できます。

@import './reset.scss'

エントリーファイルに紹介されています

// 引入全局样式
import '@/style/index.scss'

ただし、 src/styles/index.scss グローバル スタイル ファイルでは変数を使用する方法がないことがわかります。したがって、グローバル変数をプロジェクトに導入する必要があります。

style/variable.scss にvariable.scssファイルを作成します

vite.config.ts ファイルの構成は次のとおりです。

export default defineConfig((config) => {
    css: {
      preprocessorOptions: {
        scss: {
          javascriptEnabled: true,
          additionalData: '@import "./src/styles/variable.scss";',
        },
      },
    },
}

@import "./src/styles/variable.less";後者を;忘れないでください。そうしないとエラーが報告されます。

構成後、scss によって提供されるこれらのグローバル変数がコンポーネント スタイルで使用できることがわかります。

3.6 模擬データ

インストールの依存関係: vite-plugin-mock - npm

vite-plugin-mock のバージョンに注意してください。最新バージョン 3.0.0 ではエラーが報告されます。2.9.6 をインストールすることをお勧めします。

タイプ '{ localEnabled: boolean; の引数 }' は、タイプ「ViteMockOptions」のパラメータには割り当てられません。オブジェクト リテラルは既知のプロパティのみを指定でき、'localEnabled' は型 'ViteMockOptions' には存在しません。

 

pnpm install -D [email protected] mockjs

vite.config.js 構成ファイルでプラグインを有効にします。

import { UserConfigExport, ConfigEnv } from 'vite'
import { viteMockServe } from 'vite-plugin-mock'
import vue from '@vitejs/plugin-vue'
export default ({ command })=> {
  return {
    plugins: [
      vue(),
      viteMockServe({
        localEnabled: command === 'serve',
      }),
    ],
  }
}

ルート ディレクトリにモック フォルダーを作成します。必要なモック データとインターフェイスを作成します。

モックフォルダー内に user.ts ファイルを作成します

//用户信息数据
function createUserList() {
    return [
        {
            userId: 1,
            avatar:
                'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
            username: 'admin',
            password: '111111',
            desc: '平台管理员',
            roles: ['平台管理员'],
            buttons: ['cuser.detail'],
            routes: ['home'],
            token: 'Admin Token',
        },
        {
            userId: 2,
            avatar:
                'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
            username: 'system',
            password: '111111',
            desc: '系统管理员',
            roles: ['系统管理员'],
            buttons: ['cuser.detail', 'cuser.user'],
            routes: ['home'],
            token: 'System Token',
        },
    ]
}
​
export default [
    // 用户登录接口
    {
        url: '/api/user/login',//请求地址
        method: 'post',//请求方式
        response: ({ body }) => {
            //获取请求体携带过来的用户名与密码
            const { username, password } = body;
            //调用获取用户信息函数,用于判断是否有此用户
            const checkUser = createUserList().find(
                (item) => item.username === username && item.password === password,
            )
            //没有用户返回失败信息
            if (!checkUser) {
                return { code: 201, data: { message: '账号或者密码不正确' } }
            }
            //如果有返回成功信息
            const { token } = checkUser
            return { code: 200, data: { token } }
        },
    },
    // 获取用户信息
    {
        url: '/api/user/info',
        method: 'get',
        response: (request) => {
            //获取请求头携带token
            const token = request.headers.token;
            //查看用户信息是否包含有次token用户
            const checkUser = createUserList().find((item) => item.token === token)
            //没有返回失败的信息
            if (!checkUser) {
                return { code: 201, data: { message: '获取用户信息失败' } }
            }
            //如果有返回成功信息
            return { code: 200, data: {checkUser} }
        },
    },
]

axiosをインストールする

pnpm install axios

最後に、axios を介してインターフェイスをテストします。

3.7 Axios の二次パッケージ化

プロジェクトを開発する際にはバックエンドとのやり取りが避けられないため、axios プラグインを使用してネットワーク リクエストを送信する必要があります。プロジェクトを開発するとき、axios を再パッケージ化することがよくあります。

目的:

  • リクエスト インターセプターを使用すると、リクエスト インターセプターで一部のビジネスを処理できます (進行状況バーの開始、パブリック パラメーターを含むリクエスト ヘッダー)。
  • レスポンス インターセプターを使用すると、レスポンス インターセプターで一部のビジネスを処理できます (プログレス バーの終わり、サーバーから返されたデータの簡素化、http ネットワーク エラーの処理)。

ルートディレクトリにutils/request.tsを作成します。

import axios from "axios";
import { ElMessage } from "element-plus";
//创建axios实例
let request = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API,
    timeout: 5000
})
//请求拦截器
request.interceptors.request.use(config => {
    return config;
});
//响应拦截器
request.interceptors.response.use((response) => {
    return response.data;
}, (error) => {
    //处理网络错误
    let msg = '';
    let status = error.response.status;
    switch (status) {
        case 401:
            msg = "token过期";
            break;
        case 403:
            msg = '无权访问';
            break;
        case 404:
            msg = "请求地址错误";
            break;
        case 500:
            msg = "服务器出现问题";
            break;
        default:
            msg = "无网络";
​
    }
    ElMessage({
        type: 'error',
        message: msg
    })
    return Promise.reject(error);
});
export default request;

注意点:

公開されるのは、axios ではなくカプセル化されたリクエストです

基本パスが設定されているため、リクエストを送信するときに /api を運ぶ必要はありません

すべてのリクエストはリクエスト インターセプターを通過するため、リクエスト インターセプターの構成構成は何か (通常はトークン) をサーバーに送信できます。

構成オブジェクトはリクエスト インターセプタで返される必要があります。そうでない場合、リクエストは送信できません。

3.8 APIインターフェースの一元管理

プロジェクトを開発する場合、統一的に管理する必要があるインターフェイスが多数存在する場合があります。プロジェクトのインターフェースを一元管理するため、srcディレクトリにapiフォルダーを作成します。

例: 次の方法

//统一管理咱们项目用户相关的接口
​
import request from '@/utils/request'
​
import type {
​
 loginFormData,
​
 loginResponseData,
​
 userInfoReponseData,
​
} from './type'
​
//项目用户相关的请求地址
​
enum API {
​
 LOGIN_URL = '/admin/acl/index/login',
​
 USERINFO_URL = '/admin/acl/index/info',
​
 LOGOUT_URL = '/admin/acl/index/logout',
​
}
//登录接口
export const reqLogin = (data: loginFormData) =>
 request.post<any, loginResponseData>(API.LOGIN_URL, data)
//获取用户信息
​
export const reqUserInfo = () =>
​
 request.get<any, userInfoReponseData>(API.USERINFO_URL)
​
//退出登录
​
export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)

Type.ts はリクエストパラメータと受信データの種類を制限できます src/api/user/type.ts

// 登入接口需要携带参数ts类型
export interface loginForm {
    username: string,
    password: string
}
​
interface dataType {
    token: string
}
//定义登录接口返回数据类型
export interface loginResponseData {
    code: number,
    data: dataType
}
​
​
interface userInfo {
    userId: number,
    avatar: string,
    username: string,
    password: string,
    desc: string,
    roles: string[],
    buttons: string[],
    routes: string[],
    token: string
}
​
interface user {
    checkUser: userInfo
}
​
//定义服务器返回用户信息相关的数据类型
export interface userResponseData {
    code: number,
    data: user
}

おすすめ

転載: blog.csdn.net/m0_55644132/article/details/130733371