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)

推薦する

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...

MySQL ストアド プロシージャのエラー処理例の詳細な説明

この記事では、例を使用して MySQL ストアド プロシージャのエラー処理について説明します。ご参考...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

効率をN倍に高めるVimクイックリファレンステーブル15個

昨年の前半から開発と娯楽のために Linux を使い始めましたが、今では Windows には戻れま...

Ubuntu 20.04でLNMP環境を構築する方法

簡単な説明以前 Centos7 で構築し、その後個人開発環境として Ubuntu 20.04 を使っ...

MySQL データベースの操作とデータ型

目次1. データベース操作1.1 データベースの表示1.2 データベースを作成する1.3 データベー...

CSS の一部のプロパティの前には「*」または「_」が付きます。

CSS の一部のプロパティの前には「*」または「_」が付きます。さまざまなブラウザを識別する例えば...

Viteの新しい体験の詳細な説明

Vite とは何ですか? (フロントエンドの新しいおもちゃです) Vite は、ネイティブ ES モ...

Docker はすべてのコンテナをバッチ起動して閉じます

Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...

DockerにRedisをインストールし、設定ファイルとして起動する詳細な説明

更新: 最近、サーバーがマイニング ウイルスによってハッキングされたことが判明しました。これは、おそ...

Navicat がリモートで SQL Server に接続し、MySQL に変換する詳細な手順

序文最近、プロジェクトで SQL Server を使用するプログラムに遭遇しました。このデータベース...

MySQL innodb例外の修復に関する経験の共有

テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...

本をめくる効果を実現するネイティブJS

この記事では、ネイティブ JS で実装された本をめくる効果の図を紹介します。効果は次のとおりです。 ...

HTML ハイパーリンクの詳細な説明

ハイパーリンクハイパーリンクは、Web サイト上のすべてのページがハイパーリンクで接続され、ページ間...

Javascript 操作メカニズム イベントループ

目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...