arui-scripts 20.5.1 → 20.6.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/.turbo/turbo-test.log +5 -5
- package/CHANGELOG.md +14 -0
- package/build/configs/app-configs/get-defaults.js +1 -0
- package/build/configs/app-configs/index.js +2 -0
- package/build/configs/app-configs/types.d.ts +5 -1
- package/build/configs/app-configs/validate-config.d.ts +2 -0
- package/build/configs/app-configs/validate-config.js +8 -0
- package/build/configs/modules.d.ts +1 -1
- package/build/configs/modules.js +15 -9
- package/build/configs/webpack.client.js +68 -23
- package/build/configs/webpack.server.js +54 -17
- package/build/templates/start.template.js +1 -1
- package/build/tsconfig-local.tsbuildinfo +1 -1
- package/docs/modules.md +68 -28
- package/docs/settings.md +19 -0
- package/package.json +2 -1
package/docs/modules.md
CHANGED
|
@@ -351,34 +351,27 @@ arui-scripts предоставляет два решения для этой п
|
|
|
351
351
|
:warning: **Внимание!** - изоляция стилей работает только в одном направлении - стили модуля не будут применены к элементам
|
|
352
352
|
хост-приложения. Но стили хост-приложения могут быть применены к элементам модуля.
|
|
353
353
|
|
|
354
|
-
Для того чтобы использовать этот метод,
|
|
354
|
+
Для того чтобы использовать этот метод, вы можете:
|
|
355
355
|
|
|
356
|
-
1.
|
|
356
|
+
1. Использовать compat модули. В этом случае css-префикс будет добавляться автоматически. По умолчанию префикс будет иметь вид `.module-${moduleId}`. Вы можете его изменить через настройки:
|
|
357
357
|
|
|
358
358
|
```ts
|
|
359
|
-
// ./arui-scripts.config.ts
|
|
360
|
-
import type { PackageSettings } from 'arui-scripts';
|
|
361
|
-
|
|
359
|
+
// ./arui-scripts.config.ts
|
|
362
360
|
const aruiScriptsConfig: PackageSettings = {
|
|
363
361
|
compatModules: {
|
|
364
|
-
// Тут ключ - название библиотеки, значение - имя переменной в window, которая будет использоваться для получения библиотеки
|
|
365
|
-
// Это те библиотеки, которые этот проект будет предоставлять модулям, подключаемым в него
|
|
366
|
-
shared: {
|
|
367
|
-
'react': 'react',
|
|
368
|
-
'react-dom': 'reactDOM',
|
|
369
|
-
},
|
|
370
362
|
exposes: {
|
|
371
363
|
'SomeModule': {
|
|
372
364
|
entry: './src/modules/some-module/index',
|
|
373
|
-
//
|
|
374
|
-
externals: {
|
|
375
|
-
react: 'react',
|
|
376
|
-
'react-dom': 'reactDOM',
|
|
377
|
-
},
|
|
365
|
+
// префикс по умолчанию будет `.module-SomeModule`
|
|
378
366
|
},
|
|
379
|
-
'
|
|
380
|
-
entry: './src/modules/
|
|
367
|
+
'OtherModule': {
|
|
368
|
+
entry: './src/modules/other-module/index',
|
|
369
|
+
cssPrefix: '#my-prefix' // любой валидный css селектор
|
|
381
370
|
},
|
|
371
|
+
'WithoutPrefix': {
|
|
372
|
+
entry: './src/modules/other-module/index',
|
|
373
|
+
cssPrefix: false, // префикс использоваться не будет
|
|
374
|
+
}
|
|
382
375
|
}
|
|
383
376
|
}
|
|
384
377
|
}
|
|
@@ -386,16 +379,14 @@ const aruiScriptsConfig: PackageSettings = {
|
|
|
386
379
|
export default aruiScriptsConfig;
|
|
387
380
|
```
|
|
388
381
|
|
|
382
|
+
2. Использовать настройку cssPrefix для обычных модулей. **Внимание!** При использовании этой настройки по умолчанию css префикс добавится ко всем стилям приложения!
|
|
383
|
+
|
|
389
384
|
```ts
|
|
390
385
|
// ./arui-scripts.config.ts module federation
|
|
391
386
|
import type { PackageSettings } from 'arui-scripts';
|
|
392
387
|
|
|
393
388
|
const aruiScriptsConfig: PackageSettings = {
|
|
394
389
|
modules: {
|
|
395
|
-
shared: {
|
|
396
|
-
'react': '^17.0.0',
|
|
397
|
-
'react-dom': '^17.0.0',
|
|
398
|
-
},
|
|
399
390
|
exposes: {
|
|
400
391
|
'Module': './src/modules/module/index',
|
|
401
392
|
},
|
|
@@ -408,7 +399,29 @@ const aruiScriptsConfig: PackageSettings = {
|
|
|
408
399
|
export default aruiScriptsConfig;
|
|
409
400
|
```
|
|
410
401
|
|
|
411
|
-
|
|
402
|
+
Если вы хотите, чтобы префикс применился только к модулям и не менял стили всей остальной сборки - вы можете использовать настройку `modules.options.useSeparateBuild`:
|
|
403
|
+
|
|
404
|
+
```ts
|
|
405
|
+
// ./arui-scripts.config.ts module federation
|
|
406
|
+
import type { PackageSettings } from 'arui-scripts';
|
|
407
|
+
|
|
408
|
+
const aruiScriptsConfig: PackageSettings = {
|
|
409
|
+
modules: {
|
|
410
|
+
exposes: {
|
|
411
|
+
'Module': './src/modules/module/index',
|
|
412
|
+
},
|
|
413
|
+
options: {
|
|
414
|
+
cssPrefix: '.my-module',
|
|
415
|
+
useSeparateBuild: true, // для WMF будет создана отдельная сборка и css префиксы применятся только для нее. Основное приложение затронуто не будет
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export default aruiScriptsConfig;
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
Вам так же потребуется изменить входную точку модуля и добавить ваш css префикс в root элемент вашего модуля:
|
|
424
|
+
|
|
412
425
|
|
|
413
426
|
```tsx
|
|
414
427
|
// ./src/modules/some-module/index
|
|
@@ -432,6 +445,7 @@ export const unmount: ModuleUnmountFunction = (targetNode) => {
|
|
|
432
445
|
ReactDOM.unmountComponentAtNode(targetNode);
|
|
433
446
|
};
|
|
434
447
|
|
|
448
|
+
// Если вы используете compat модули:
|
|
435
449
|
(window as WindowWithMountableModule).SomeModule = { // имя переменной в window должно соответствовать имени модуля в exposes
|
|
436
450
|
mount: mountModule,
|
|
437
451
|
unmount: unmountModule,
|
|
@@ -455,7 +469,6 @@ Webpack module federation делает абсолютно то же самое,
|
|
|
455
469
|
`default` модули:
|
|
456
470
|
- **+++** Простой способ для переиспользования библиотек между модулем и приложением-хостом.
|
|
457
471
|
- **+++** Возможность использовать разные версии общих библиотек в разных модулях/хостах (речь про те библиотеки, которые будут шарится).
|
|
458
|
-
- **---** Нет встроенной изоляции стилей. Стили модуля будут применены к хост-приложению.
|
|
459
472
|
- **---** Нет возможности использовать модуль в приложении, которое не использует webpack.
|
|
460
473
|
|
|
461
474
|
Проблема изоляции стилей может быть решена с помощью [shadow dom](#shadow-dom),
|
|
@@ -466,13 +479,11 @@ Webpack module federation делает абсолютно то же самое,
|
|
|
466
479
|
- **---** Нет возможности использовать разные версии общих библиотек в разных модулях/хостах, если вы хотите их шарить.
|
|
467
480
|
|
|
468
481
|
*Как понять какой режим использовать?*
|
|
469
|
-
|
|
470
|
-
вам в таком случае не грозят. Если же вы используете обычный css, или ваши библиотеки используют обычный css, то лучше
|
|
471
|
-
использовать `compat` режим.
|
|
482
|
+
Рекомендуется всегда выбирать `default` режим. `compat` режим оставлен для совместимости. На данный момент все фичи `compat` режима реализованы в `default` модулях.
|
|
472
483
|
|
|
473
484
|
## Shadow dom
|
|
474
485
|
[Shadow DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM) - это спецификация, которая позволяет
|
|
475
|
-
создавать изолированные DOM-деревья,
|
|
486
|
+
создавать изолированные DOM-деревья, не влияющие на DOM-дерево родительского элемента.
|
|
476
487
|
|
|
477
488
|
arui-scripts предоставляет возможность использовать shadow dom для модулей. Для этого вам нужно:
|
|
478
489
|
|
|
@@ -514,6 +525,31 @@ export const MyAwesomeComponent = () => {
|
|
|
514
525
|
Этот режим работает как для _default_, так и для _compat_ модулей.
|
|
515
526
|
Внутри targetElementRef будет создаваться shadowRoot, и модуль и его стили будут монтироваться в него.
|
|
516
527
|
|
|
528
|
+
## Работа с порталами
|
|
529
|
+
|
|
530
|
+
В обоих вариантах нужно вспомнить про порталы. Оба метода меняют то, к какой части дом-дерева будут применяться стили. Поскольку порталы по умолчанию зачастую рендрятся в body - стили из модуля не смогут корректно примениться.
|
|
531
|
+
Стандартный компонент [portal](https://core-ds.github.io/core-components/master/?path=/docs/portal--docs) из core-components
|
|
532
|
+
умеет получать targetNode из провайдера:
|
|
533
|
+
|
|
534
|
+
```tsx
|
|
535
|
+
import { PortalContext } from '@alfalab/core-components/shared';
|
|
536
|
+
|
|
537
|
+
const CSS_PREFIX = 'module-SomeModule';
|
|
538
|
+
|
|
539
|
+
export const mount: ModuleMountFunction = (targetNode, runParams, serverState) => {
|
|
540
|
+
ReactDOM.render(
|
|
541
|
+
<div className={ CSS_PREFIX }>
|
|
542
|
+
<PortalContext.Provider value={() => document.querySelector(CSS_PREFIX)}>
|
|
543
|
+
Hello from module!
|
|
544
|
+
</PortalContext.Provider>
|
|
545
|
+
</div>,
|
|
546
|
+
targetNode,
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
Если в коде приложения так же используются какие-либо еще варианты обращения к глобальным dom-элементам (head, body, ...) вам так же нужно модифицировать код для корректной работы с css-префиксами или shadowDOM.
|
|
552
|
+
|
|
517
553
|
# Кеширование модулей
|
|
518
554
|
|
|
519
555
|
По умолчанию модули будут загружаться каждый раз при использовании. Если ваше приложение будет монтировать/размонтировать модуль несколько раз,
|
|
@@ -721,6 +757,10 @@ type Modules = {
|
|
|
721
757
|
};
|
|
722
758
|
shared?: (string | SharedObject)[] | SharedObject; // конфигурация shared параметра для ModuleFederationPlugin
|
|
723
759
|
shareScope?: string // скоуп который будет присваиваться модулям в shared если иное имя не будет задано в sharedConfig. Значение по умолчанию - 'default'
|
|
760
|
+
options?: { // дополнительные настройки модулей
|
|
761
|
+
cssPrefix?: false | string; // префикс, который будет добавляться ко всем css стилям
|
|
762
|
+
useSeparateBuild?: boolean; // использовать ли отдельную сборку для wmf. Влияет на то, к чему будет применяться cssPrefix. Если false - cssPrefix применится ко всей сборке приложения
|
|
763
|
+
}
|
|
724
764
|
};
|
|
725
765
|
|
|
726
766
|
type SharedObject = {
|
package/docs/settings.md
CHANGED
|
@@ -238,6 +238,25 @@ const settings = {
|
|
|
238
238
|
Использование swc позволяет значительно ускорить сборку (до 2 раз на больших проектах), но не будет создавать полностью идентичный с babel код.
|
|
239
239
|
Итоговый бандл может получиться немного больше, чем при использовании babel, но разница полностью компенсируется при использовании сжатия.
|
|
240
240
|
|
|
241
|
+
#### experimentalReactCompiler
|
|
242
|
+
Позволяет включить [react-compiler](https://react.dev/learn/react-compiler/introduction) в вашем проекте. **Внимание!** Этот режим находится в статусе эксперимента и использовать его в продакшене на данный момент не рекомендуется!
|
|
243
|
+
|
|
244
|
+
Включение этой опции на данный момент поддерживается только вместе с `codeLoader=swc`.
|
|
245
|
+
|
|
246
|
+
Возможные значения:
|
|
247
|
+
- `disabled` - дефолт, react-compiler выключен
|
|
248
|
+
- `ReactCompilerOptions` - [конфигурация](https://react.dev/reference/react-compiler/configuration) компилятора.
|
|
249
|
+
|
|
250
|
+
При использовании с react < 19 вам необходимо добавить в зависимости вашего проекта `react-compiler-runtime` и использовать настройку `target`, например:
|
|
251
|
+
```ts
|
|
252
|
+
const packageSettings = {
|
|
253
|
+
// ...
|
|
254
|
+
experimentalReactCompiler: {
|
|
255
|
+
target: '18', // или '17'
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
```
|
|
259
|
+
|
|
241
260
|
#### installServerSourceMaps
|
|
242
261
|
Добавлять ли в серверную сборку пакет source-map-support. По умолчанию `false`.
|
|
243
262
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arui-scripts",
|
|
3
|
-
"version": "20.
|
|
3
|
+
"version": "20.6.0",
|
|
4
4
|
"main": "./build/index.js",
|
|
5
5
|
"typings": "./build/index.d.ts",
|
|
6
6
|
"license": "MPL-2.0",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"babel-jest": "28.1.3",
|
|
51
51
|
"babel-loader": "9.2.1",
|
|
52
52
|
"babel-plugin-istanbul": "^7.0.0",
|
|
53
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
53
54
|
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
|
|
54
55
|
"brotli-dict": "^1.1.4",
|
|
55
56
|
"case-sensitive-paths-webpack-plugin": "2.4.0",
|