Elementはスクリプトを使用して新しいコンポーネントを自動的に構築します

Elementはスクリプトを使用して新しいコンポーネントを自動的に構築します

背景

会社のプロジェクトでは、新しい要件に遭遇するたびに、新しいページの作成 => Vue テンプレートなどのページにコンテンツを追加 => ルーティングを追加するという手順をまだ使用していますか。面倒だと思いませんか?もしそうなら、自動ビルドを試してみてはいかがでしょうか? とても良いですよ!

element-ui の自動構築はどのように機能しますか?

オープンソース プロジェクト、特に UI ライブラリの開発では、協力する人が多すぎて、コーディングの習慣がそれぞれ異なります。さらに、UI ライブラリの各コンポーネントには、多言語、ユニット テスト、ルーティング、コンポーネントの readme.md ドキュメントなどのファイルも含まれます。そのため、毎回ゆっくりと作成するのは面倒ですし、ルーティングファイルなどの公開ファイルを複数の人が変更すると、多くの競合が発生します。そのため、オープンソース プロジェクトには、特定のファイルを自動的に生成するスクリプトが数多く存在します。

メイクファイル

element-ui プロジェクトのルート ディレクトリに makefile があります。各コマンドの機能はコメントに記載されています。 Windows ユーザーは、ダウンロードするスクリプトを実行するために make コマンドを使用する必要があります。 Mac ユーザーには必要ありません。

@# デフォルトの #comment はログに出力されますが、@# は出力されません。PHONY の役割: 以下のスクリプト コマンドの dist および test ディレクトリとの競合のチェックを無視します。つまり、コマンドはとにかく実行されます。PHONY: dist test

@# makeコマンドを実行すると、デフォルトでヘルプスクリプトが実行されます: help

@# `make build-theme` を実行すると、`npm run build:theme` スクリプトが実行されます。
@# : 実行するコマンドはコロンの前であり、コロンの後の最初の行はタブで、その後にスクリプトコマンド @# が続きます。つまり、以下は 'tab+npm npm build: theme' です。
# すべてのテーマをビルドする
@# 上記のビルド テーマのコメントは以下のスクリーンショットに表示され、build-theme がログに出力されます。 
 npm 実行ビルド:テーマ
インストール:
 npmインストール
開発者:
 npm 実行 dev
@# $() は使用する関数です @# $@ は現在のコマンド自体です。たとえば、'make new' の場合、$@ は new です
@# MAKECMDGOALS 特殊変数。コマンドラインパラメータで指定されたターゲットリストを記録します。つまり、この変数を使用して、コマンドラインパラメータを取得できます。@# たとえば、新しいコンポーネントを作成する場合は、スクリプト `make new wailen` を使用します。MAKECMDGOALS は wailen に等しくなります。
@# フィルターアウトアンチフィルター関数、$(MAKECMDGOALS) 内の $@ を含むすべてのコンテンツをフィルターアウトします @# new.js の内容と組み合わせると、以下のスクリプトの意味は、新しいコンポーネントを作成し、コンポーネント名を渡すことです。コンポーネント名は new にすることはできません。コンポーネント名が new の場合、以下のスクリーンショットのように new が表示されます。
 ノードビルド/bin/new.js $(フィルターアウト$@、$(MAKECMDGOALS))
@# 一部のスクリプトは省略されています。興味のある方は、ソースコードのヘルプを確認してください。
 @echo " \033[35mmake\033[0m \033[1mコマンド命令\033[0m"
 @echo " \033[35mmake install\033[0m\t\033[0m\t\033[0m\t\033[0m\t--- 依存関係をインストールします"
 @echo " \033[35mmake new <コンポーネント名> [中国語名]\033[0m\t--- 新しいコンポーネント パッケージを作成します。たとえば、'make new button button'"
 @echo " \033[35mmake dev\033[0m\t\033[0m\t\033[0m\t\033[0m\t--- 開発モード"
 @echo " \033[35mmake dist\033[0m\t\033[0m\t\033[0m\t\033[0m\t--- プロジェクトをコンパイルし、ターゲット ファイルを生成します"
 @echo " \033[35mmake deploy\033[0m\t\033[0m\t\033[0m\t\033[0m\t--- デモをデプロイ"
 @echo " \033[35mmake pub\033[0m\t\033[0m\t\033[0m\t\033[0m\t--- npm に公開"
 @echo " \033[35mmake new-lang <lang>\033[0m\t\033[0m\t\033[0m\t--- サイトに新しい言語を追加します。たとえば、'make new-lang fr'"

# コメント出力

新しいキーワードをフィルタリングします。受信パラメータが新しい場合は、それをフィルタリングします。

もちろん、make を使用したくない場合は、node スクリプトを直接実行することもできます。たとえば、make の新しいコンポーネント名は、node build/bin/new.js のコンポーネント名と同じです。

新しい.js

new.js は自動化のコア ファイルです。まず考えてみましょう。コンポーネント ファイルの作成は、たった 2 つのステップで済みます。

  • ファイルを作成する
  • コンテンツを追加

ファイル保存

主にファイル保存パッケージを通じてファイルを作成し、コンテンツを追加します。まずはAPIを見てみましょう

const fileSave = require('file-save');
const コンテンツ = "const fs = require('fs');"
const callback = () => { console.log('スクリプト実行') }
fileSave('ファイルパス')
   .write('上記のようなファイルコンテンツ', 'utf8', callback) // コンテンツの書き込みが成功すると、コールバックがトリガーされます。write('コンテンツの追加を続行', 'utf8')
   .end('\n') // ファイル操作は空行で終了します

これにより、次のファイルが生成されます

詳しいドキュメントについては、file-saveを参照してください。

element-ui では、作成する必要があるファイル名とコード コンテンツを管理するために、Files 配列オブジェクトが使用されます。

このように、Files を直接ループすることで、対応するファイルを作成できます。

// パッケージを作成する
// コンポーネント生成ディレクトリ const PackagePath = path.resolve(__dirname, '../../packages', componentname);
Files.forEach(ファイル => {
  fileSave(path.join(PackagePath, file.filename))
    .write(ファイル.content, 'utf8')
    .end('\n');
});

参照リソースファイルの変更

さらに、コンポーネントを作成した後は、通常、ルーティング構成ファイルなど、コンポーネントを参照する必要がある対応する場所を変更する必要があります。ファイル保存を通じて対応するルートを追加することもできます。ファイル保存自体は以前のファイルの内容が上書きされ、削除後に再生成されます。したがって、元のコンテンツに追加したい場合は、元のファイルのコンテンツを取得してから、新しいコンテンツを追加する必要があります。次のことが可能です:

const fileSave = require('file-save');
定数 fs = require('fs');

const content = `const fileSave = require('file-save'); `
const oldCode = fs.readFileSync('./demo.js')
ファイル保存('demo.js')
  .write(古いコード+コンテンツ、'utf8')
  .end('\n')

つまり、fs モジュールを通じてファイルの古い内容を読み取り、それを結合します。 Element-ui はこれを実行します:

fs.createWriteStream

ファイル保存の原則は、fs.createWriteStream API をカプセル化することです。
使い方を簡単に説明する

定数 fs = require('fs')

//<stream.Writable> から継承した書き込み可能なストリーム fs.WriteStream クラスのオブジェクトを作成します。
const writer = fs.createWriteStream('createStream.js', { // ファイルを検索し、存在しない場合は作成します // デフォルト値は w です。writer.write メソッドを呼び出してデータを書き込むと、ファイルのすべての内容が直接上書きされます。
    // これにより、ファイルの以前の内容がすべて削除され、新しいデータが書き込まれます。フラグ: 'w'
})


//ストリームにデータを書き込む writer.write('このファイルの新しい内容')

file-save のソース コードは、以下の疑似コードで確認できます。

定数 savefs = {}
savefs._create_dir = 関数 (fp, opts) {
  mkdirp.sync(fp, opts);
}
savefs.wstream = 関数 (ファイル) {
  var ws = fs.createWriteStream(ファイル);
  this.writer = ws;
  これを返します。
}
savefs.write = function(チャンク、エンコーディング、cb) {
  ...
}

savefs.end = function(チャンク、エンコーディング、cb) {
  ...
}

savefs.finish = 関数(cb) {
  ...
}

savefs.error = 関数(cb) {
  ...
}
エクスポート { savefs }

もちろん、Node の fs.writeFile API を使用してファイルを直接作成することもできます。

fs.writeFile('ファイルパス', '書き込むコンテンツ', ['エンコーディング'], 'コールバック関数');

パラメータはfile-saveと同じであることがわかります。

要約する

結局のところ、自動コンポーネント作成は、2 つのコア作成ファイルにコンテンツを追加することにすぎません。これら 2 つの操作は、ファイル保存パッケージを通じて実行できます。その後、生成されたファイルのパスと内容を独自のビジネスと組み合わせて構成し、一部のパブリック ファイルの参照を新しいファイル リソースに変更することができます。 Node でスクリプトを書くことは、バックエンドを書くよりもはるかに面白いと思いますか?

エレメントスクリプトを使用して新しいコンポーネントを自動的に構築する実装例に関するこの記事はこれで終わりです。エレメントスクリプトを使用して新しいコンポーネントを自動的に構築する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue Element に基づいてカスタムツリーを構築するためのサンプルコード

<<:  純粋な CSS ドロップダウン メニュー

>>:  モバイルデバイス Web 開発における HTML ヘッドの書き方

推薦する

Vue+ElementUI はページング関数を実装します - mysql データ

目次1. 問題2. 解決策2.1 ページングコンポーネント2.2 データベースデータを取得する関数:...

vue3 再帰コンポーネントカプセル化の全プロセス記録

目次序文1. 再帰コンポーネント2. 右クリックメニューコンポーネント要約する序文今日、プロジェクト...

Linux 上のカラフルな猫

Linux システムを使用したことがある友人なら、 catコマンドを使用したことがあるはずです。もち...

Alibaba Cloud ServerにMySQLデータベースをインストールする方法の詳細な説明

序文学習中に Zookeeper をインストールする必要があったため、仮想マシンに常に問題が発生した...

MySQLの起動と接続方法の例分析

目次mysqldの起動方法方法 1: mysqld方法 2: mysqld_safe方法3: mys...

HTML入力で値が変更されたときにリスナーイベントを追加することの簡単な分析

達成される効果多くの場合、入力ボックスの値の変化をリアルタイムで監視し、ブラウザを誘導してウェブサイ...

Vue デフォルトスロットの理解とサンプルコード

目次スロットとは何かデフォルトスロットの理解コードスニペット要約するスロットとは何かスロットは、親コ...

div間のギャップの解決策

HTMLのdivブロックを使用していて、ブロックの中央をしっかりと接続できず、解決できない場合1. ...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

MySQL 5.7.21 解凍版インストール Navicat データベース操作ツールインストール

MySQL解凍版とNavicatデータベース操作ツールのインストールは、以下のとおりです。 1. M...

WeChatアプレットで計算機機能を実装する

この記事は、WeChat アプレットを使用して作成された簡単な計算機です。興味のある方はご覧ください...

JavaScript ファクトリーパターンの説明

目次シンプルファクトリーファクトリーメソッド安全な工場方法アブストラクトファクトリー要約するシンプル...

HTML 画像 img にハイパーリンクを追加した後の醜い青い境界線の問題を解決する

HTML画像にハイパーリンクを追加すると醜い青い枠線が表示される次のように:解決: CSS スタイル...

VScode リモート SSH リモート編集とデバッグコード

Visual Studio Code の最新の Insider バージョンには、コードのリモート デ...

無効と読み取り専用の機能と違い

1: readonly は、このコントロールをロックして、インターフェイス上で変更できないようにしま...