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/.eslintrc.js +2 -0
- package/.turbo/turbo-lint.log +27 -16
- package/.turbo/turbo-test.log +9 -4
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/build/configs/util/apply-overrides.d.ts +8 -0
- package/build/configs/util/find-plugin.d.ts +83 -0
- package/build/configs/util/find-plugin.js +23 -0
- package/build/configs/webpack.client.dev.js +2 -0
- package/build/configs/webpack.client.js +3 -0
- package/build/configs/webpack.client.prod.js +2 -0
- package/build/configs/webpack.server.dev.js +2 -1
- package/build/configs/webpack.server.prod.js +2 -1
- package/build/plugins/arui-runtime/arui-runtime-module.d.ts +7 -0
- package/build/plugins/arui-runtime/arui-runtime-module.js +23 -0
- package/build/plugins/arui-runtime/index.d.ts +11 -0
- package/build/plugins/arui-runtime/index.js +50 -0
- package/build/tsconfig-local.tsbuildinfo +1 -1
- package/docs/modules.md +50 -3
- package/docs/overrides.md +59 -0
- package/package.json +1 -1
package/docs/modules.md
CHANGED
|
@@ -337,8 +337,11 @@ export const MyAwesomeComponent = () => {
|
|
|
337
337
|
Для решения конфликтов стилей вы можете попробовать перевести проект на css-modules, но это может быть довольно
|
|
338
338
|
трудоемкой задачей, особенно если у вас уже есть большая кодовая база.
|
|
339
339
|
|
|
340
|
-
|
|
341
|
-
|
|
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](
|
|
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
|
+
```
|