Viteプロジェクトを作成する手順

Viteプロジェクトを作成する手順

序文

Vite2 のリリースと安定性の向上により、ますます多くのプロジェクトがそれを使用しようとしています。 Vite を使用する場合、通常は次のコマンドを使用してプロジェクトを作成します。

// npm を使用する
npm init @vitejs/app
// 糸を使う
糸作成@vitejs/app

 
// プロジェクト名を指定して特定のフレームワークのテンプレートを使用する場合は、次のようにします // npm
vue.js のテンプレートファイル
//糸
糸作成 @vitejs/app my-vue-app --template vue

これらのコマンドを実行すると、プロジェクト フォルダーが生成されます。ほとんどの人にとっては、通常どおりプロジェクトを作成するだけで十分かもしれませんが、これらのコマンドを実行するとプロジェクト フォルダーが生成される理由が気になります。ここでは、プロジェクトを作成する例として糸を取り上げます。

yarn create は何をしますか?

多くのプロジェクトが yarn create コマンドを使用して作成されるのはなぜかと疑問に思う人も多いかもしれません。ここでは、Vite に加えて、同じ方法で React プロジェクトを作成します: yarn create react-app my-app
では、このコマンドは何をするのでしょうか? 実際には次の 2 つのことを行います。

糸グローバル追加create-react-app
React アプリの作成、私のアプリ

糸の作成の詳細については、こちらをご覧ください

ソースコード分析

yarn create @vitejs/appコマンドを実行すると、@vitejs/create-app 内のコードが実行されます。まずこのファイルのプロジェクト構造を見てみましょう

template で始まるフォルダーはすべて、さまざまなフレームワークと対応する TypeScript バージョンのプロジェクト テンプレートです。これらについてはあまり心配する必要はありません。プロジェクトを作成するロジックはすべて index.js ファイルにあります。ここで何が行われているか見てみましょう

プロジェクトの依存関係

1つ目は依存関係の導入です

定数 fs = require('fs')
定数パス = require('path')
const argv = require('minimist')(process.argv.slice(2))
const プロンプト = require('プロンプト')
定数{
  黄色、
  緑、
  シアン、
  青、
  マゼンタ、
  ライトレッド、
  赤
} = 'コロリスト' が必要です

fs と path は Nodejs の組み込みモジュールですが、minimist、prompts、kolorist はそれぞれサードパーティの依存ライブラリです。

  • minimist: はコマンドライン引数を解析するためのツールです。書類
  • prompts: はコマンドライン対話型ツールです。書類
  • kolorist: コマンドライン出力をカラフルにするツールです。書類

テンプレート構成

次に、さまざまなフレームワーク テンプレートの構成ファイルが生成され、最後にテンプレート名の配列が生成されます。

// ここでは、vue と react フレームワークの設定のみを記述します。他の設定はそれほど違いはありません。興味がある場合は、ソース コードを参照してください。
const フレームワーク = [
  ......
  
  {
    名前: 'vue',
    色: 緑、
    バリエーション: [
      {
        名前: 'vue',
        表示: 'JavaScript',
        色: 黄色
      },
      {
        名前: 'vue-ts'、
        表示: 'TypeScript',
        色: 青
      }
    ]
  },
  {
    名前: 'react',
    色: シアン、
    バリエーション: [
      {
        名前: 'react',
        表示: 'JavaScript',
        色: 黄色
      },
      {
        名前: 'react-ts'、
        表示: 'TypeScript',
        色: 青
      }
    ]
  },
  
  ......
]

// 出力テンプレート名リスト const TEMPLATES = FRAMEWORKS.map(
  (f) => (f.variants && f.variants.map((v) => v.name)) || [f.name]
).reduce((a, b) => a.concat(b), [])

次に、.gitignore ファイルの特殊性により、各フレームワーク プロジェクト テンプレートの下に最初に _gitignore ファイルが作成され、後でプロジェクトが作成されるときに .gitignore に置き換えられます。したがって、名前を変更する必要があるファイルを格納するためのオブジェクトがコード内に事前定義されます。

const renameFiles = {
  _gitignore: '.gitignore'
}

ユーティリティ関数

コア機能について説明する前に、コードで定義されているツール機能を見てみましょう。最も重要なのは、ファイル操作に関連する 3 つの関数です。

コピー

関数コピー(src, dest) {
  定数 stat = fs.statSync(src)
  (stat.isDirectory())の場合{
    copyDir(ソース、宛先)
  } それ以外 {
    fs.copyFileSync(ソース、宛先)
  }
}

コピー関数は、ファイルまたはフォルダー src を指定されたフォルダー dest にコピーするために使用されます。まず、src のステータス stat を取得します。src がフォルダーの場合、つまり stat.isDirectory() が true の場合は、以下で紹介する copyDir 関数を呼び出して、src フォルダー内のファイルを dest フォルダーにコピーします。逆に、src がファイルの場合は、fs.copyFileSync 関数が直接呼び出され、src ファイルが dest フォルダーにコピーされます。

コピーディレクトリ

関数 copyDir(srcDir, destDir) {
  fs.mkdirSync(destDir, { 再帰: true })
  for (const file of fs.readdirSync(srcDir)) {
    const srcFile = path.resolve(srcDir, ファイル)
    const destFile = path.resolve(destDir, ファイル)
    コピー(srcFile, destFile)
  }
}

copyDir 関数は、フォルダー srcDir 内のファイルを指定されたフォルダー destDir にコピーするために使用されます。まず、fs.mkdirSync 関数を呼び出して指定されたフォルダーを作成し、次に fs.readdirSync を呼び出して srcDir フォルダーからファイルを取得し、それらを 1 つずつ走査してコピーします。最後に、copy 関数を呼び出してコピーします。フォルダー内にファイルまたはフォルダーが存在する可能性があるため、ここで再帰が使用されます。

空のディレクトリ

関数emptyDir(dir) {
  fs.existsSync(dir) が存在する場合 {
    戻る
  }
  for (const file of fs.readdirSync(dir)) {
    const abs = path.resolve(dir, ファイル)
    if (fs.lstatSync(abs).isDirectory()) {
      空のディレクトリ(abs)
      fs.rmdirSync(絶対値)
    } それ以外 {
      fs.unlinkSync(abs)
    }
  }
}

emptyDir 関数は、dir フォルダーの下のコードをクリアするために使用されます。まず、dir フォルダーが存在するかどうかを判断します。存在する場合は、フォルダー内のファイルを走査し、ファイルのパス abs を構築します。abs がフォルダーの場合、emptyDir 関数を再帰的に呼び出してフォルダー内のファイルを削除し、次に fs.rmdirSync を呼び出してフォルダーを削除します。abs がファイルの場合、fs.unlinkSync 関数を呼び出してファイルを削除します。

コア機能

次は、コア機能を実装する init 関数です。

コマンドライン操作とフォルダの作成

最初のステップはコマンドラインパラメータを取得することです

targetDir = argv._[0]とします。
テンプレートをargv.templateとします || argv.t

const defaultProjectName = !targetDir ? 'vite-project' : targetDir

argv._[0]は@vitejs/appの後の最初のパラメータを表します。
テンプレートは使用するテンプレートの名前です
defaultProjectName は、作成したプロジェクトの名前です。
次のステップでは、prompts パッケージを使用して、次のようにコマンド ラインでクエリを出力します。

具体的なコードは次のとおりです。

// コマンドラインインタラクションに関するコードはここにすべて記載されていません。興味があればソースコードを参照してください。let result = {}

結果 = プロンプトを待つ(
  [
    {
      タイプ: targetDir ? null: 'text',
      名前: 'プロジェクト名',
      メッセージ: 'プロジェクト名:',
      初期値: defaultProjectName、
      onState: (状態) =>
        (targetDir = state.value.trim() || defaultProjectName)
    },
    ......
    
  ]
)

const { フレームワーク、上書き、パッケージ名、バリアント } = 結果

定数ルート = path.join(cwd, targetDir)

if (上書き) {
  空のディレクトリ(ルート)
} そうでない場合 (!fs.existsSync(root)) {
  fs.mkdirSync(ルート)
}

テンプレート = バリアント || フレームワーク || テンプレート

// プロジェクト フォルダーのパスを出力します console.log(`\n${root} 内のスキャフォールディング プロジェクト...`)

const templateDir = path.join(__dirname, `template-${template}`)

選考が完了すると、選考結果が返されます
ルートはpath.join関数によって構築された完全なファイルパスです。
overwrite は、作成したいファイルと同じ名前のファイルがすでに存在する場合に、それを上書きするかどうかを指定します。上書きする場合は、前の emptyDir 関数を呼び出してフォルダーを空にします。フォルダーが存在しない場合は、fs.mkdirSync を呼び出してフォルダーを作成します。
templateDir 選択したテンプレートフォルダの名前

ファイルへの書き込み

const write = (ファイル、コンテンツ) => {
  const targetPath = renameFiles[ファイル]
    ? path.join(ルート、renameFiles[ファイル])
    : パス.join(ルート、ファイル)
  if (コンテンツ) {
    fs.writeFileSync(ターゲットパス、コンテンツ)
  } それ以外 {
      コピー(path.join(templateDir, file), targetPath)
  }
}

const ファイル = fs.readdirSync(templateDir)
for (const file of files.filter((f) => f !== 'package.json')) {
  書き込み(ファイル)
}

const pkg = require(path.join(templateDir, `package.json`))

pkg.name = パッケージ名

書き込み('package.json'、JSON.stringify(pkg、null、2))

const pkgManager = /yarn/.test(process.env.npm_execpath) ? 'yarn' : 'npm'

// プロジェクトが作成されたことを通知するプロンプトを出力し、次にプロジェクトを開始するために実行する必要があるコマンドを通知します console.log(`\n完了しました。次に実行します:\n`)
(ルート!== cwd)の場合{
console.log(` cd ${path.relative(cwd, root)}`)
}
console.log(` ${pkgManager === 'yarn' ? `yarn` : `npm install`}`)
console.log(` ${pkgManager === 'yarn' ? `yarn dev` : `npm run dev`}`)
コンソールログ()

書き込み関数は、ファイルとコンテンツの 2 つのパラメータを受け入れ、次の 2 つの機能を持ちます。

  • 指定されたコンテンツ content を指定されたファイル file に書き込み、fs.writeFileSync 関数を呼び出してコンテンツをファイルに書き込みます。
  • テンプレートフォルダ内のファイルを指定のフォルダにコピーし、先ほど紹介したコピー関数を呼び出してファイルをコピーします。

次に、fs.readdirSync を呼び出してテンプレート フォルダー内のファイルを読み取り、それらを 1 つずつ走査してプロジェクト フォルダーにコピーします (package.json ファイルは、名前フィールドを変更する必要があるためフィルター処理されます)。最後に、package.json ファイルに書き込みます。

まとめ

Vite の create-app パッケージの実装には約 320 行のコードしかありませんが、さまざまなシナリオの互換性が考慮されており、これを学習すれば、このような CLI ツールを自分で実装することは難しくありません。

Viteプロジェクト作成の実装手順に関するこの記事はこれで終わりです。より関連性の高いViteプロジェクト作成コンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vite2.0+vue3 モバイルプロジェクトの詳細な説明
  • Vue3.0 + TypeScript + Vite初体験の詳しい説明
  • vue3 プロジェクトを素早く構築し、関連機能を紹介する vite+ts の詳細な説明
  • vite2.0 設定学習の詳しい説明(typescript 版)
  • vite2.x は ant-design-vue@next コンポーネントのオンデマンド読み込みを実装します。
  • ViteでReactプロジェクトを構築する方法
  • vite+vue3+element-plus プロジェクトをビルドする手順
  • Vue3.0+vite2は動的非同期コンポーネントの遅延読み込みを実装します
  • プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

<<:  MySQL Workbenchのダウンロードと使用方法のチュートリアルの詳細な説明

>>:  MySQL5.7+ MySQL Workbenchのインストールと設定方法のグラフィックチュートリアル(MAC)

推薦する

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

Windows での Nginx のインストールと環境設定 (nginx をサービスとして実行)

最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...

要素テーブルの行と列のドラッグを実装する例

要素 ui テーブルにはドラッグ アンド ドロップによる並べ替え機能が組み込まれておらず、サードパー...

MySQL バージョン 5.7.24 のデータベース インストール プロセスの詳細なグラフィック説明

MySQL は最も人気のあるリレーショナル データベース管理システムです。WEB アプリケーションに...

mysql5.7 のエンコーディングを utf8mb4 に設定する方法

最近、問題に遭遇しました。モバイル端末の絵文字や一部の絵文字は 4 バイトですが、UTF-8 は 3...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

Vue開発の一般的な手法の詳細な説明

目次$nextTick() $forceUpdate() $セット() .sync——2.3.0 以...

vuex での Getter の使用法の詳細な説明

序文Vuex を使用すると、ストア内に「ゲッター」を定義できます (これはストアの計算されたプロパテ...

ページの下部にHTMLフッターを配置する簡単な方法

要件:ページ コンテンツが短く、ブラウザーの高さをサポートできない場合でも、フッターをウィンドウの下...

vscode で console.log を書く 2 つの簡単な方法の詳細な説明

(I) 方法 1: 事前にスクリプト タグ内に直接定義します。この HTML ファイルにのみ適用され...

Linux の一般的なハードディスク管理コマンドの紹介

目次1. dfコマンド2. duコマンド3. fsckファイルシステム修復コマンド4. ディスクステ...

W3C チュートリアル (12): W3C SOAP アクティビティ

Web サービスは、アプリケーション間の通信に関係しています。SOAP は、Web サービス間の X...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...

Flex プログラム Firefox で中国語を入力すると文字化けするバグ

Firefox の下位バージョンでは中国語の文字を入力できず、上位バージョンでは文字化けした文字が表...