uniapp+vue3+vite+ts+uview-plus 最も完全で詳細なプロジェクト構築手順#
プロジェクトの準備作業:
vue-cli
を使用してuni-app
プロジェクトを作成し、TS の書き方との互換性を高める。
node バージョン:v18.16.0
pnpm バージョン:8.3.0
vscode に uni-app 開発プラグインをインストール:
- uni-create-view:uni-app ページを迅速に作成;
- uni-helper:uni-app コード補完、5 つのミニプログラム拡張パッケージを含む;
一. uni-app
プロジェクトの作成#
主にvue-cli
を使用してuni-app
プロジェクトを作成し、TS の書き方との互換性を高め、Vue3/Vite 版を使用:
npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project
注意:
- Vue3/Vite 版は node バージョン
^14.18.0 || >=16.0.0
を要求します。 - コマンドラインでの作成が失敗した場合は、直接giteeにアクセスしてテンプレートをダウンロードしてください。
インストールプロセスや注意事項についての詳細は公式サイトを参照してください:uni-app 公式サイト
二. uni-app プロジェクトのコンパイルと実行#
依存関係のインストール pnpm install
2. プロジェクトの実行 pnpm dev:mp-weixin
プロジェクトを実行する際、package.json ファイルを開き、scripts 設定でプロジェクトを実行するコマンドを確認できます。もし WeChat ミニプログラムを実行する場合は、pnpm devを使用し、パッケージ化は pnpm buildです。もちろん、"serve": "pnpm dev" のようにショートカット起動コマンドを自分で設定することもできます。
プロジェクトを実行した後、ディレクトリに dist フォルダが生成され、その中の dev フォルダ内の mp-weixin ファイルがコンパイルされたファイルとして使用されます。
3. WeChat 開発者ツールのインポート
プロジェクトの実行が完了したら、指示に従って WeChat 開発者ツールを開き、dist\dev\mp-weixin をインポートして実行します。この時、WeChat 開発者ツールでプロジェクトが正常に実行され、コンパイルされます。
三. TS タイプチェック#
プロジェクト構造を開くと、tsconfig.json にエラーメッセージが表示されます:
Option 'importsNotUsedAsValues' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '"ignoreDeprecations": "5.0"' to silence this error.
Use 'verbatimModuleSyntax' instead.ts
説明:警告メッセージは TypeScript コンパイラオプションの importsNotUsedAsValues の非推奨に関するもので、verbatimModuleSyntax オプションの使用を推奨しています。TypeScript 5.5 以前でエラーメッセージを無効にするには、コンパイラオプションに ignoreDeprecations":"5.0" を追加できます。
解決策:tsconfig.json ファイルの "compilerOptions" 設定内に "ignoreDeprecations": "5.0" を追加できます。
"compilerOptions": {
"ignoreDeprecations": "5.0"
},
この時、vue ファイルを開いて任意のコンポーネントを記述します:
<image mode="xxx"></image>
image 内蔵コンポーネントの mode 属性には明らかに “xxx” の属性値はありませんが、コードにはエラーメッセージが表示されません。したがって、Ts チェックに準拠するために、追加の Ts タイプチェックを設定する必要があります。
1. タイプ宣言ファイルのインストール:
npm i -D @types/wechat-miniprogram @uni-helper/uni-app-types
2. tsconfig.json の設定:
// tsconfig.json
{
"extends": "@vue/tsconfig/tsconfig.json",
"compilerOptions": {
"ignoreDeprecations": "5.0",
"sourceMap": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"lib": ["esnext","dom"],
"types": [
"@dcloudio/types", // uni-app API タイプ
"miniprogram-api-typings", // 原生WeChatミニプログラムタイプ
"@uni-helper/uni-app-types" // uni-app コンポーネントタイプ
]
},
// vue コンパイラタイプ、タグタイプをチェック
"vueCompilerOptions": {
"nativeTags": ["block","component","template","slot"],
},
"include": ["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]
}
設定が完了すると、先ほどの vue コンポーネントにエラーメッセージが表示され、~~image コンポーネントの下に赤い波線が表示されることがあります;~~ 表示されない場合もあります。
四. JSON コメントの問題#
manifest.json および pages.json ファイルでは、しばしばコメント情報を追加しますが、JSON 規格ではファイル内にコメントを追加することはサポートされておらず、無効なマークとして扱われ、解析エラーを引き起こします。
この時、vscode の作業スペースで設定を行うことができます:
vscode パネルの右下の設定ボタンをクリック→設定をクリック→設定を検索で「ファイル関連」を検索→Files: Associations の設定項目を見つけ→項目を追加→manifest.json
とpages.json
をjsonc
に設定します。
五. uview-plus のインストール#
使用する UI フレームワークは uview-plus で、uview-plus は uView2.0 を基に初歩的に修正され、vue3 の書き方をサポートし、コンポーネントも非常に豊富です。ここではインストールおよび設定手順を簡単に紹介します。具体的な詳細手順は公式サイトを参照してください:uview-plus 3.0 - nvue と完全互換の uni-app エコシステムフレームワーク - uni-app UI フレームワーク
1. インストール
npm install uview-plus
npm install dayjs
npm install clipboard
注意:このインストール方法は、npm 方式インストールの設定に従って設定されている必要があり、プロジェクト名に中文キャラクターを含めることはできません。
uview-plus は SCSS に依存しているため、このプラグインをインストールする必要があります。さもなければ正常に動作しません。
// sassをインストール
npm install sass -D
// sass-loaderをインストール、バージョン10が必要です。さもなければvueとsassの互換性の問題でエラーが発生する可能性があります。
npm install sass-loader@10 -D
2. 設定手順
uview-plus の主 JS ライブラリをインポート:プロジェクトのsrc
ディレクトリ内のmain.ts
に uview-plus の JS ライブラリをインポートして使用します。この 2 行はconst app = createSSRApp(App)
の後に配置する必要があります。
// main.ts
import uviewPlus from 'uview-plus'
import App from './App.vue'
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
app.use(uviewPlus)
return {
app
}
}
// #endif
uview-plus のグローバル SCSS テーマファイルをインポート:プロジェクトのルートディレクトリのuni.scss
にこのファイルをインポートします。
/* uni.scss */
@import 'uview-plus/theme.scss';
他の css は削除してください。
uview-plus の基本スタイルをインポート:App.vue
の最初の行にインポートし、style タグに lang="scss" 属性を追加することに注意してください。
// App.vue
<style lang="scss">
/* 最初の行に書くことに注意し、styleタグにlang="scss"属性を追加します */
@import "uview-plus/index.scss";
</style>
easycom コンポーネントモードを設定:プロジェクトのsrc
ディレクトリのpages.json
で行います。
// pages.json
{
"easycom": {
// 必ずcustom内に配置してください。さもなければ無効です。https://ask.dcloud.net.cn/question/131175
"custom": {
"^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue"
}
},
// これは元々の内容です
"pages": [
// ......
]
}
注意:
設定後、mian.ts で uview-plus をインポートする際に ts エラーが表示されることがあります:モジュール “uview-plus” の宣言ファイルが見つかりません。
src フォルダ内に types フォルダを作成し、ts タイプ宣言ファイルを保存するために、uview.d.ts ファイルを新規作成し、以下の宣言コードを記述します:
declare module "uview-plus"
3. 使用
ダウンロードと設定が完了したら、特定のページでコンポーネントを直接使用できます。import
でコンポーネントをインポートする必要はありません。
<u-button text="提出"></u-button>
六. pinia の永続化設定#
vue3+vite で使用される状態管理ライブラリは pinia です。公式サイト:Pinia 中国語文書
1. pinia のインストール: HBuilder X を使用する場合は手動でインストールする必要はなく、直接使用できます。CLI を使用する場合は手動でインストールする必要があります:
pnpm add [email protected]
- 使用法:
//main.ts
import { createSSRApp } from 'vue';
import * as Pinia from 'pinia';
export function createApp() {
const app = createSSRApp(App);
app.use(Pinia.createPinia());
return {
app,
Pinia, // ここでPiniaを返す必要があります
};
}
Store ファイル counter.ts を作成します。
// stores/counter.js
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => {
return { count: 0 };
},
// こう定義することもできます
// state: () => ({ count: 0 })
actions: {
increment() {
this.count++;
},
},
});
コンポーネント内で使用します:
<script setup>
import { useCounterStore } from '@/stores/counter'
const counter = useCounterStore()
counter.count++
// 自動補完! ✨
counter.$patch({ count: counter.count + 1 })
// またはアクションを使用して代替
counter.increment()
</script>
<template>
<!-- storeからstateに直接アクセス -->
<div>現在のカウント: {{ counter.count }}</div>
</template>
注意:pinia と vuex には同様の欠点があり、ページをリフレッシュするとデータが失われます。したがって、一般的にログインのトークンなどの情報は store に保存されるだけでなく、ローカルストレージなどにも保存され、永続化ストレージを実現します。
ここでは永続化ストレージを実現するために、プラグイン迅速開始 | pinia-plugin-persistedstateを使用します。
1. プラグインのインストール
pnpm i pinia-plugin-persistedstate
2. プラグインを pinia インスタンスに追加
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
3. 使用法
Store を作成する際に、persist
オプションをtrue
に設定します。
import { defineStore } from 'pinia'
export const useStore = defineStore(
'main',
() => {
const someState = ref('こんにちは pinia')
return { someState }
},
{
persist: true,
},
)
4. マルチプラットフォーム互換性
export const useMemberStore = defineStore(
'main',
() => {
//…省略
},
{
// 永続化を設定
persist: {
// マルチプラットフォームAPIに互換性を持たせる
storage: {
setItem(key, value) {
uni.setStorageSync(key, value)
},
getItem(key) {
return uni.getStorageSync(key)
},
},
},
},
)
七. HTTP リクエストのラッピング#
axios データリクエストをより便利に行うために、ミニプログラムのデータリクエストを Promise リクエスト関数としてラッピングできます。
1. リクエストとファイルアップロードインターセプター
uniapp インターセプター:uni.addInterceptor
// src/utils/http.ts
// リクエストの基本URL
const baseURL = 'xxxx'
// インターセプター設定
const httpInterceptor = {
// インターセプト前にトリガー
invoke(options: UniApp.RequestOptions) {
// 1. httpで始まらない場合はURLを結合
if (!options.url.startsWith('http')) {
options.url = baseURL + options.url
}
// 2. リクエストタイムアウト
options.timeout = 10000
// 3. ミニプログラム端のリクエストヘッダー識別子を追加
options.header = {
'source-client': 'miniapp',
...options.header,
}
// 4. トークンリクエストヘッダー識別子を追加
const memberStore = useMemberStore()
const token = memberStore.profile?.token
if (token) {
options.header.Authorization = token
}
},
}
// requestリクエストをインターセプト
uni.addInterceptor('request', httpInterceptor)
// uploadFileファイルアップロードをインターセプト
uni.addInterceptor('uploadFile', httpInterceptor)
注意事項:WeChat ミニプログラム端では、WeChat 公式プラットフォームで合法的なドメイン名を設定する必要があります。
2. Promise リクエスト関数のラッピング
要求オブジェクトを返し、戻り値のタイプを処理し、成功時には resolve でデータを抽出し、ジェネリックを追加し、失敗時には reject でエラーをキャッチします。
/**
* リクエスト関数
* @param UniApp.RequestOptions
* @returns Promise
* 1. Promiseオブジェクトを返し、戻り値のタイプを処理
* 2. データ取得成功
* 2.1 コアデータres.dataを抽出
* 2.2 タイプを追加し、ジェネリックをサポート
* 3. データ取得失敗
* 3.1 401エラー -> ユーザー情報をクリアし、ログインページにリダイレクト
* 3.2 その他のエラー -> バックエンドのエラーメッセージに基づいて軽いヒント
* 3.3 ネットワークエラー -> ユーザーにネットワークを変更するように通知
*/
type Data<T> = {
code: string
msg: string
result: T
}
// 2.2 タイプを追加し、ジェネリックをサポート
export const http = <T>(options: UniApp.RequestOptions) => {
// 1. Promiseオブジェクトを返す
return new Promise<Data<T>>((resolve, reject) => {
uni.request({
...options,
// レスポンス成功
success(res) {
// ステータスコード2xx、axiosの設計を参考
if (res.statusCode >= 200 && res.statusCode < 300) {
// 2.1 コアデータres.dataを抽出
resolve(res.data as Data<T>)
} else if (res.statusCode === 401) {
// 401エラー -> ユーザー情報をクリアし、ログインページにリダイレクト
const memberStore = useMemberStore()
memberStore.clearProfile()
uni.navigateTo({ url: '/pages/login/login' })
reject(res)
} else {
// その他のエラー -> バックエンドのエラーメッセージに基づいて軽いヒント
uni.showToast({
icon: 'none',
title: (res.data as Data<T>).msg || 'リクエストエラー',
})
reject(res)
}
},
// レスポンス失敗
fail(err) {
uni.showToast({
icon: 'none',
title: 'ネットワークエラー、ネットワークを変更してみてください',
})
reject(err)
},
})
})
}
八。その他の設定#
1. vue3 の自動インポート:
vue3 のメソッド(例えば‘ref’など)を手動でインポートするのは面倒です。ここではプラグイン unplugin-auto-import を使用して自動インポートを実現します。公式サイト:unplugin-auto-import - npm
インストール:
npm i unplugin-auto-import -save
vue.config.js ファイルに設定を追加:
//vite.config.ts
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import AutoImport from 'unplugin-auto-import/vite'
// https://vitejs.dev/config/
export default defineConfig({
build: {
sourcemap: process.env.NODE_ENV === 'development',
},
plugins: [
uni(),
AutoImport({ // 使用
imports: ['vue'],
dts: 'src/auto-import.d.ts',
// eslintを使用している場合は記述を追加してください。使用していない場合は無視できます。
eslintrc: {
enabled: true,
},
})
],
})
eslintrc.js ファイルの設定(eslint を使用している場合のみ設定):
//.eslintrc.js
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier',
'plugin:prettier/recommended', // prettierプラグインを追加
],
設定が完了したら、プロジェクトを再起動すれば大丈夫です!
プロジェクト設定中に参考にできるビデオ:Day1-01-uni-app 小兔鲜儿导学视频_哔哩哔哩_bilibili
皆さんの議論や提案の追加を歓迎します...
その他の依存関係#
npm install miniprogram-api-typings --save-dev
もし vscode に関連するエラーが表示された場合は、このパッケージをインストールしてください。