arui-scripts 15.8.2 → 15.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/modules.md CHANGED
@@ -337,8 +337,11 @@ export const MyAwesomeComponent = () => {
337
337
  Для решения конфликтов стилей вы можете попробовать перевести проект на css-modules, но это может быть довольно
338
338
  трудоемкой задачей, особенно если у вас уже есть большая кодовая база.
339
339
 
340
- Простое решение, которое предлагает arui-scripts - это использование другого типа модулей, основанного не
341
- на module-federation. Эти модули мы называем _compat_ модулями.
340
+ arui-scripts предоставляет два решения для этой проблемы:
341
+ - _compat_ модули
342
+ - использование shadow dom
343
+
344
+ ## compat модули
342
345
 
343
346
  Суть метода заключается в том, что ко всем стилям модуля будет добавляться префикс, который позволит изолировать
344
347
  стили модуля от стилей приложения-потребителя.
@@ -431,7 +434,7 @@ Webpack module federation делает абсолютно то же самое,
431
434
  - **---** Нет встроенной изоляции стилей. Стили модуля будут применены к хост-приложению.
432
435
  - **---** Нет возможности использовать модуль в приложении, которое не использует webpack.
433
436
 
434
- Проблема изоляции стилей может быть решена с помощью [shadow dom](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM),
437
+ Проблема изоляции стилей может быть решена с помощью [shadow dom](#shadow-dom),
435
438
  или с помощью css modules. Но это накладывает некоторые ограничения либо на поддерживаемые браузеры (shadow dom), либо на
436
439
  существующую кодовую базу (css modules должны использоваться везде, если у вас будет две версии arui-feather на странице - будет не очень приятно).
437
440
 
@@ -444,6 +447,50 @@ Webpack module federation делает абсолютно то же самое,
444
447
  вам в таком случае не грозят. Если же вы используете обычный css, или ваши библиотеки используют обычный css, то лучше
445
448
  использовать `compat` режим.
446
449
 
450
+ ## Shadow dom
451
+ [Shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) - это спецификация, которая позволяет
452
+ создавать изолированные DOM-деревья, которые не будут влиять на DOM-дерево родительского элемента.
453
+
454
+ arui-scripts предоставляет возможность использовать shadow dom для модулей. Для этого вам нужно:
455
+
456
+ - На стороне модуля - использовать `arui-scripts` старше `15.9.2`.
457
+ - На стороне потребителя - указать параметр `useShadowDom` в `useModuleMounter`:
458
+
459
+ ```tsx
460
+ import {
461
+ createModuleLoader,
462
+ createModuleFetcher,
463
+ useModuleMounter,
464
+ MountableModule,
465
+ } from '@alfalab/scripts-modules';
466
+
467
+ const loader = createModuleLoader<MountableModule>({
468
+ hostAppId: 'bar-app',
469
+ moduleId: 'test',
470
+ getModuleResources: createModuleFetcher({
471
+ baseUrl: 'https://examle.com/foo-app',
472
+ }),
473
+ });
474
+
475
+ export const MyAwesomeComponent = () => {
476
+ const { loadingState, targetElementRef } = useModuleMounter({
477
+ loader,
478
+ useShadowDom: true, // !!!
479
+ });
480
+
481
+ return (
482
+ <div>
483
+ {loadingState === 'pending' && <div>pending...</div>}
484
+ {loadingState === 'rejected' && <div>Error</div>}
485
+ <div ref={targetElementRef} /> {/* сюда будет монтироваться модуль */}
486
+ </div>
487
+ );
488
+ }
489
+ ```
490
+
491
+ Этот режим работает как для _default_, так и для _compat_ модулей.
492
+ Внутри targetElementRef будет создаваться shadowRoot, и модуль и его стили будут монтироваться в него.
493
+
447
494
  # Другие типы модулей
448
495
 
449
496
  Помимо создания монтируемых модулей, есть возможность создавать и другие типы модулей, более подходящие для некоторых вариантов использования.
package/docs/overrides.md CHANGED
@@ -120,3 +120,62 @@ export default overrides;
120
120
  не боясь что это повлияет на другие конфигурации.
121
121
 
122
122
  Созданная таким образом конфигурация будет шарить с оригинальной конфигурацией только плагин для формирования assets-manifest'а.
123
+
124
+ ### Переопределение плагинов или загрузчиков для конфигураций webpack
125
+ Иногда может понадобиться возможность поменять конфигурацию конкретного загрузчика или плагина, для этого в `webpackClient`, `webpackClientDev`, `webpackServer` и `webpackServerDev` третьим параметром можно получить хелпер-функции `findLoader` и `findPlugin`:
126
+ ```ts
127
+ import type { OverrideFile } from 'arui-scripts';
128
+
129
+ const overrides: OverrideFile = {
130
+ webpackClient: (config, appConfig, { findLoader, findPlugin }) => {
131
+ // ...
132
+ }
133
+ };
134
+
135
+ export default overrides;
136
+ ```
137
+ - `findLoader` - помогает найти загрузчик для переопределения. Функция возвращает ссылку, поэтому вы можете спокойно мутировать этот результат и обходиться без создания нового объекта через spread-оператор. В качестве аргументов принимает `config` и `testRule`, по которому будет искаться загрузчик. Пример:
138
+ ```ts
139
+ import type { OverrideFile } from 'arui-scripts';
140
+
141
+ const overrides: OverrideFile = {
142
+ webpackClient: (config, appConfig, { findLoader }) => {
143
+ const cssModulesLoader = findLoader(config, '/\\.module\\.css$/')
144
+ const currentCssLoader = cssModulesLoader.use.find((cssLoader) => {
145
+ return cssLoader.loader.includes('css-loader') && !cssLoader.loader.includes('postcss-loader')
146
+ })
147
+
148
+ currentCssLoader.options.modules = {
149
+ localIdentName: '[name]-[local]-[hash:base64:5]'
150
+ }
151
+
152
+ return config
153
+ }
154
+ };
155
+
156
+ export default overrides
157
+ ```
158
+ - `findPlugin` - помогает найти плагин для переопределения. Функция так же возвращает ссылку. В качестве аргументов принимает `config` и название плагина. Все типизировано, поэтому название можете достать из автокомплита. для `webpackClient` и `webpackClientDev` из автокомплита будут приходить клиентские плагины, а для `webpackServer` и `webpackServerDev` серверные. Примеры:
159
+ ```ts
160
+ import type { OverrideFile } from 'arui-scripts';
161
+
162
+ const overrides: OverrideFile = {
163
+ webpackClient: (config, appConfig, { findPlugin }) => {
164
+ const [MiniCssExtractPlugin] = findPlugin(config, 'MiniCssExtractPlugin')
165
+
166
+ // возвращаемые плагины так же типизированы
167
+ MiniCssExtractPlugin.options.ignoreOrder = false
168
+
169
+ return config
170
+ },
171
+ webpackServerDev: (config, appConfig, { findPlugin }) => {
172
+ const [BannerPlugin] = findPlugin(config, 'BannerPlugin');
173
+
174
+ BannerPlugin.options.banner = 'unexpected error';
175
+
176
+ return config
177
+ }
178
+ };
179
+
180
+ export default overrides
181
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arui-scripts",
3
- "version": "15.8.2",
3
+ "version": "15.10.0",
4
4
  "main": "./build/index.js",
5
5
  "typings": "./build/index.d.ts",
6
6
  "license": "MPL-2.0",