@babel/template
コンピュータサイエンスでは、これは準クォートの実装として知られています。
インストール
- npm
- Yarn
- pnpm
npm install --save-dev @babel/template
yarn add --dev @babel/template
pnpm add --save-dev @babel/template
文字列の使用法
文字列引数付きの関数としてtemplateを呼び出す場合、テンプレートが使用されるときに置き換えられるプレースホルダーを指定できます。
プレースホルダーには、構文プレースホルダー(例:%%name%%)または識別子プレースホルダー(例:NAME)の2種類を使用できます。@babel/templateはデフォルトでこれらの両方のアプローチをサポートしていますが、これらを混在させることはできません。使用している構文について明示的に指定する必要がある場合は、syntacticPlaceholdersオプションを使用できます。
構文プレースホルダーはBabel 7.4.0で導入されたことに注意してください。@babel/templateのバージョンを制御できない場合(たとえば、@babel/core@^7.0.0ピア依存関係からインポートする場合)、識別子プレースホルダーを使用する必要があります。一方、構文プレースホルダーにはいくつかの利点があります。識別子が構文エラーになる場所(関数の本体やエクスポート宣言など)で使用でき、大文字の変数(例:new URL())と競合しません。
入力(構文プレースホルダー)
import template from "@babel/template";
import generate from "@babel/generator";
import * as t from "@babel/types";
const buildRequire = template(`
var %%importName%% = require(%%source%%);
`);
const ast = buildRequire({
importName: t.identifier("myModule"),
source: t.stringLiteral("my-module"),
});
console.log(generate(ast).code);
入力(識別子プレースホルダー)
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});
出力
const myModule = require("my-module");
.ast
プレースホルダーを使用しておらず、文字列をASTに解析する簡単な方法が必要な場合は、テンプレートの.astバージョンを使用できます。
const ast = template.ast(`
var myModule = require("my-module");
`);
これにより、ASTが直接解析されて返されます。
テンプレートリテラルの使用法
import template from "@babel/template";
import generate from "@babel/generator";
import * as t from "@babel/types";
const source = "my-module";
const fn = template`
var IMPORT_NAME = require('${source}');
`;
const ast = fn({
IMPORT_NAME: t.identifier("myModule"),
});
console.log(generate(ast).code);
プレースホルダーは、読みやすくするためにテンプレートリテラルの一部として直接渡すことも、テンプレート関数に渡すこともできます。
.ast
プレースホルダーを使用しておらず、文字列をASTに解析する簡単な方法が必要な場合は、テンプレートの.astバージョンを使用できます。
const name = "my-module";
const mod = "myModule";
const ast = template.ast`
var ${mod} = require("${name}");
`;
これにより、ASTが直接解析されて返されます。前に述べた文字列ベースのバージョンとは異なり、これはテンプレートリテラルであるため、テンプレートリテラルの置換を使用して置換を実行することは依然として有効です。
ASTの結果
@babel/template APIは、期待される構造を持つASTをできるだけ簡単に作成できるように、いくつかの柔軟なAPIを公開しています。これらの各APIには、上記で説明した.astプロパティもあります。
template
templateは、解析結果に応じて、単一のステートメントまたはステートメントの配列のいずれかを返します。
template.smart
これは、デフォルトのtemplate APIと同じで、解析結果に応じて、単一のノードまたはノードの配列のいずれかを返します。
template.statement
template.statement("foo;")()は、単一のステートメントノードを返し、結果が単一のステートメント以外の場合は例外をスローします。
template.statements
template.statements("foo;foo;")()は、ステートメントノードの配列を返します。
template.expression
template.expression("foo")()は、式のノードを返します。
template.program
template.program("foo;")()は、テンプレートのProgramノードを返します。
API
template(code, [opts])
code
型: string
options
@babel/templateは、Babel Parserのすべてのオプションを受け入れ、独自のデフォルトを指定します
allowReturnOutsideFunctionは、デフォルトでtrueに設定されています。allowSuperOutsideMethodは、デフォルトでtrueに設定されています。sourceTypeは、デフォルトでmoduleに設定されています。
syntacticPlaceholders
型: boolean デフォルト: %%foo%%スタイルのプレースホルダーが使用されている場合はtrue、それ以外の場合はfalse。追加: v7.4.0
このオプションがtrueの場合、テンプレートでプレースホルダーをマークするために%%foo%%を使用できます。falseの場合、プレースホルダーはplaceholderWhitelistおよびplaceholderPatternオプションで決定される識別子です。
placeholderWhitelist
型: Set<string> デフォルト: undefined
このオプションは
syntacticPlaceholders: trueとは互換性がありません
自動的に受け入れるプレースホルダー名のセット。このリストの項目は、指定されたプレースホルダーパターンと一致する必要はありません。
placeholderPattern
型: RegExp | false デフォルト: /^[_$A-Z0-9]+$/
このオプションは
syntacticPlaceholders: trueとは互換性がありません
プレースホルダーと見なす必要があるIdentifierおよびStringLiteralノードを探すときに検索するパターン。'false'はプレースホルダーの検索を完全に無効にし、プレースホルダーを見つけるための「placeholderWhitelist」値のみを残します。
preserveComments
型: boolean デフォルト: false
codeパラメーターからコメントを保持するには、これをtrueに設定します。
戻り値
デフォルトでは、@babel/templateは、オプションの置換オブジェクトで呼び出されるfunctionを返します。例については、使用法のセクションを参照してください。
.astを使用する場合、ASTが直接返されます。