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)

推薦する

Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

序文私が作成中の Markodwn エディターに同期スクロール機能を追加する必要があります。Baid...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...

シンプルなHTMLとCSSの使い方の詳細な説明

HTML と CSS を含む JD.com のホームページの静的ページ効果を 3 日間で完成させます...

JavaScript ベースのシンプルなカルーセルの実装

この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...

Mysql マスタースレーブレプリケーションの注意事項の説明

1. マスター'x@xxxx:x'への接続エラー- 再試行時間: 60 再試行回数:...

よくある CSS のヒントと経験談 11 選

1. 画像の下にある数ピクセルの空白を削除するにはどうすればよいですか?コードをコピーコードは次のと...

Doubanウェブサイトのウェブサイトコンテンツに小さな変更を加える方法

<br />読みやすさはウェブサイトにとって非常に重要な部分であり、ウェブサイトの核心と...

さまざまな解像度やブラウザでウェブページを適切に表示する方法

キーコードは次のとおりです。コードをコピーコードは次のとおりです。 html{高さ:100%; }コ...

Linux の一般的な Java プログラム起動スクリプトのコード例

シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...

CocosCreatorがスキル冷却効果を実装

CocosCreatorがスキルCD効果を実現多くのゲームにはスキルがあります。プレイヤーがスキルボ...

mysql: [エラー] 不明なオプション '--skip-grant-tables'

MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...

MySQL ストアド プロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考ま...

Linux 占有ポートの強制解放と Linux ファイアウォールのポート開放方法の詳しい説明

nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...

Centos7 で Java8 と MySQL をインストールしてデプロイする

通常、Java の学習とプロジェクトのデプロイはローカルで行われますが、実稼働環境は Linux 環...

Mysqlのインポートとエクスポート時に発生する問題の解決

背景すべての業務を Docker の運用管理に移行してから、一連の落とし穴に遭遇しましたが、今回は ...