banner
xingli

xingli

猫娘爱好者

uniapp整合viewPlus vue3

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.jsonpages.jsonjsoncに設定します。

五. 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 を使用する場合は手動でインストールする必要があります:

  1. 使用法:
//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 に関連するエラーが表示された場合は、このパッケージをインストールしてください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。