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 ヘッドの書き方

推薦する

Typescript+React でモバイルと PC でシンプルなドラッグ アンド ドロップ効果を実現

この記事では、モバイルとPCで簡単なドラッグアンドドロップ効果を実現するためのTypescript ...

Navicat Premium15 でクラウド サーバーに接続する際のデータベースの問題と落とし穴

クラウドサーバーを使用するとデータベースに接続できる場合もありますが、Navicat Premium...

SELINUXの動作原理の詳細な説明

1. はじめにSELinux が Linux にもたらす主な価値は、柔軟で構成可能な MAC メカニ...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

LinuxでSVNサーバーを構築する方法

1: SVNをインストールする yum インストール -y サブバージョン2. 倉庫を作る1: 倉庫...

Vue の基本 MVVM、テンプレート構文、データバインディング

目次1. Vueの概要Vue公式サイトMVVM アーキテクチャ パターンVue の紹介2. Vueを...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

NexusはHTTPSプロトコルをサポートするためにnginxプロキシを使用します

背景すべての会社の Web サイトは HTTPS プロトコルをサポートする必要があります。Aliba...

CSS3で実装された6つの境界遷移効果

6つの効果実装コードhtml <h1>CSS 境界遷移</h1> <セ...

JavaScript の基礎: 即時実行関数

目次関数フォーマットを即時実行関数を即座に実行する他の方法 – 式即時実行される関数はパラメータを取...

Vue で Openlayer を使用して読み込みアニメーション効果を実現する

注意: スコープアニメーションは使用できません。 ! ! ! GIF経由 <テンプレート>...

Nginx サーバーで Web クローラーをブロックおよび禁止する方法

通常、すべての Web サイトは、多くの非検索エンジン クローラーに遭遇します。これらのクローラーの...

MySQL ストアド プロシージャ関連の権限変更の問題

MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変...

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...