Color mode

プラグインの配布と検証

このページは プラグイン作成の詳細 の一部で、Plugin のパッケージ化、配布、検証を扱います。

22. Site 内だけで使う Plugin

Plugin は npm に公開しなくても利用できます。

Site 内に、

text
site/
└─ extensions/
   └─ local-plugin.ts

のように置いて definePlugin() できます。

ts
// site/extensions/local-plugin.ts
 
return definePlugin({
  name: "site-local",
 
  assets: [
    {
      pluginName: "site-local",
      kind: "style",
      moduleSpecifier:
        "/extensions/plugin.css",
    },
  ],
});

Site-local Plugin も Published Plugin と同じ、

  • Dependency Resolution
  • Pipeline
  • Hooks
  • Diagnostics
  • Renderer
  • Page Type

などの Contract を利用します。

createStyleAsset() と createClientEntry() は @riebeckite/plugin-<name>/... の specifier しか組み立てないため、その名前で ない package(未公開 Plugin、別名の公開 package)は Host Bundler が解決できる moduleSpecifier を直接指定してください。

23. Package として配布する

Plugin を再利用可能な Package として配布する場合は、たとえば次の構成にできます。

text
packages/plugins/example/
├─ index.ts
├─ components/       # 必要な場合のみ
├─ client.ts         # 必要な場合のみ
├─ src/
│  ├─ remark.ts
│  ├─ rehype.ts
│  ├─ renderer.ts
│  └─ types.ts
├─ style.css         # 必要な場合のみ
├─ package.json
├─ README_ja.md
└─ README.md

Riebeckite repository 内では packages/plugins/backlinks が参考になります。

公開 package では Build 済み ESM と型定義を publish し、exports をその成果物へ 向け、prepack script で build します。Repository の build script は publish されないため、esbuild(format: "esm"、packages: "external"、 external: ["@riebeckite/*"])と tsc --emitDeclarationOnly による小さな build を 用意してください。最小構成の package.json は Repository 外で Plugin を配布する を参照してください。

ただし、すべての Plugin に client.ts、style.css、components/ が必要なわけではありません。

必要なものだけを作成してください。

24. Repository 外で配布する

外部 Plugin Package は Riebeckite monorepo の内部構造に依存させません。

基本的には、

text
@riebeckite/core

の Public API を利用します。

Plugin 自身が持つ、

text
./client
./components
./style.css

などは、自身の package.json の exports で公開します。

次のような Internal Import は使用しません。

ts
import {
  something,
} from "@riebeckite/core/src/...";

monorepo 内にしか存在しない相対 Path にも依存しないでください。

25. ESM

NodeNext / ESM Package では、Build 後の JavaScript を Node.js が実際に解決できる必要があります。

Development 時だけ TypeScript Loader が、

text
extensionless import

などを解決できている状態に依存しないでください。

Package の正しさは Source Code だけではなく、Build 後の配布形式でも確認する必要があります。

26. Plugin を検証する

実装後は、小さい範囲から順番に確認します。

Diagram source
text
flowchart LR
    Check["check"]
    Doctor["doctor"]
    Inspect["inspect plugins"]
    Build["build"]
 
    Check --> Doctor
    Doctor --> Inspect
    Inspect --> Build

まず Configuration と Plugin Resolution を確認します。

sh
pnpm exec riebeckite check

次に Project の Health を確認します。

sh
pnpm exec riebeckite doctor

解決された Plugin を確認します。

sh
pnpm exec riebeckite inspect plugins

最後に実際の生成物まで確認します。

sh
pnpm exec riebeckite build

Plugin が解決されない場合は、まず check の出力から、

  • Import Error
  • Missing Capability
  • Duplicate Provider
  • Dependency Cycle
  • Invalid Options

などを確認してください。

History

1 changesCollapseExpand
1 + ---
2 + title: プラグインの配布と検証
3 + sidebar:
4 + label: 配布と検証
5 + order: 30
6 + ---
7 + # プラグインの配布と検証
8 +
9 + このページは [プラグイン作成の詳細](../plugin-system.ja.md) の一部で、Plugin のパッケージ化、配布、検証を扱います。
10 +
11 + ## 22. Site 内だけで使う Plugin
12 +
13 + Plugin は npm に公開しなくても利用できます。
14 +
15 + Site 内に、
16 +
17 + ```text id="17msvn"
18 + site/
19 + └─ extensions/
20 + └─ local-plugin.ts
21 + ```
22 +
23 + のように置いて `definePlugin()` できます。
24 +
25 + ```ts id="mqm2gv"
26 + // site/extensions/local-plugin.ts
27 +
28 + return definePlugin({
29 + name: "site-local",
30 +
31 + assets: [
32 + {
33 + pluginName: "site-local",
34 + kind: "style",
35 + moduleSpecifier:
36 + "/extensions/plugin.css",
37 + },
38 + ],
39 + });
40 + ```
41 +
42 + Site-local Plugin も Published Plugin と同じ、
43 +
44 + - Dependency Resolution
45 + - Pipeline
46 + - Hooks
47 + - Diagnostics
48 + - Renderer
49 + - Page Type
50 +
51 + などの Contract を利用します。
52 +
53 + `createStyleAsset()` と `createClientEntry()` は
54 + `@riebeckite/plugin-<name>/...` の specifier しか組み立てないため、その名前で
55 + ない package(未公開 Plugin、別名の公開 package)は Host Bundler が解決できる
56 + `moduleSpecifier` を直接指定してください。
57 +
58 +
59 + ## 23. Package として配布する
60 +
61 + Plugin を再利用可能な Package として配布する場合は、たとえば次の構成にできます。
62 +
63 + ```text id="fs7fzp"
64 + packages/plugins/example/
65 + ├─ index.ts
66 + ├─ components/ # 必要な場合のみ
67 + ├─ client.ts # 必要な場合のみ
68 + ├─ src/
69 + │ ├─ remark.ts
70 + │ ├─ rehype.ts
71 + │ ├─ renderer.ts
72 + │ └─ types.ts
73 + ├─ style.css # 必要な場合のみ
74 + ├─ package.json
75 + ├─ README_ja.md
76 + └─ README.md
77 + ```
78 +
79 + Riebeckite repository 内では `packages/plugins/backlinks` が参考になります。
80 +
81 + 公開 package では Build 済み ESM と型定義を publish し、`exports` をその成果物へ
82 + 向け、`prepack` script で build します。Repository の build script は publish
83 + されないため、`esbuild`(`format: "esm"`、`packages: "external"`、
84 + `external: ["@riebeckite/*"]`)と `tsc --emitDeclarationOnly` による小さな build を
85 + 用意してください。最小構成の `package.json` は
86 + [Repository 外で Plugin を配布する](../../reference/plugin-api.ja.md#repository-外で-plugin-を配布する)
87 + を参照してください。
88 +
89 + ただし、すべての Plugin に `client.ts`、`style.css`、`components/` が必要なわけではありません。
90 +
91 + 必要なものだけを作成してください。
92 +
93 +
94 + ## 24. Repository 外で配布する
95 +
96 + 外部 Plugin Package は Riebeckite monorepo の内部構造に依存させません。
97 +
98 + 基本的には、
99 +
100 + ```text id="8pn4j3"
101 + @riebeckite/core
102 + ```
103 +
104 + の Public API を利用します。
105 +
106 + Plugin 自身が持つ、
107 +
108 + ```text id="svimxk"
109 + ./client
110 + ./components
111 + ./style.css
112 + ```
113 +
114 + などは、自身の `package.json` の `exports` で公開します。
115 +
116 + 次のような Internal Import は使用しません。
117 +
118 + ```ts id="y6jy1n"
119 + import {
120 + something,
121 + } from "@riebeckite/core/src/...";
122 + ```
123 +
124 + monorepo 内にしか存在しない相対 Path にも依存しないでください。
125 +
126 +
127 + ## 25. ESM
128 +
129 + NodeNext / ESM Package では、Build 後の JavaScript を Node.js が実際に解決できる必要があります。
130 +
131 + Development 時だけ TypeScript Loader が、
132 +
133 + ```text id="5k12um"
134 + extensionless import
135 + ```
136 +
137 + などを解決できている状態に依存しないでください。
138 +
139 + Package の正しさは Source Code だけではなく、**Build 後の配布形式でも確認する**必要があります。
140 +
141 +
142 + ## 26. Plugin を検証する
143 +
144 + 実装後は、小さい範囲から順番に確認します。
145 +
146 + ```mermaid id="b4ivxl"
147 + flowchart LR
148 + Check["check"]
149 + Doctor["doctor"]
150 + Inspect["inspect plugins"]
151 + Build["build"]
152 +
153 + Check --> Doctor
154 + Doctor --> Inspect
155 + Inspect --> Build
156 + ```
157 +
158 + まず Configuration と Plugin Resolution を確認します。
159 +
160 + ```sh id="bgxy4d"
161 + pnpm exec riebeckite check
162 + ```
163 +
164 + 次に Project の Health を確認します。
165 +
166 + ```sh id="8bfj5k"
167 + pnpm exec riebeckite doctor
168 + ```
169 +
170 + 解決された Plugin を確認します。
171 +
172 + ```sh id="ad0h9x"
173 + pnpm exec riebeckite inspect plugins
174 + ```
175 +
176 + 最後に実際の生成物まで確認します。
177 +
178 + ```sh id="f7grlr"
179 + pnpm exec riebeckite build
180 + ```
181 +
182 + Plugin が解決されない場合は、まず `check` の出力から、
183 +
184 + - Import Error
185 + - Missing Capability
186 + - Duplicate Provider
187 + - Dependency Cycle
188 + - Invalid Options
189 +
190 + などを確認してください。
191 +