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/docs/modules.md CHANGED
@@ -351,34 +351,27 @@ arui-scripts предоставляет два решения для этой п
351
351
  :warning: **Внимание!** - изоляция стилей работает только в одном направлении - стили модуля не будут применены к элементам
352
352
  хост-приложения. Но стили хост-приложения могут быть применены к элементам модуля.
353
353
 
354
- Для того чтобы использовать этот метод, вам нужно:
354
+ Для того чтобы использовать этот метод, вы можете:
355
355
 
356
- 1. Изменить конфигурацию модуля в `arui-scripts.config.ts`:
356
+ 1. Использовать compat модули. В этом случае css-префикс будет добавляться автоматически. По умолчанию префикс будет иметь вид `.module-${moduleId}`. Вы можете его изменить через настройки:
357
357
 
358
358
  ```ts
359
- // ./arui-scripts.config.ts compatModules
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
- // Это те библиотеки, которые модуль будет пытаться получить из window
374
- externals: {
375
- react: 'react',
376
- 'react-dom': 'reactDOM',
377
- },
365
+ // префикс по умолчанию будет `.module-SomeModule`
378
366
  },
379
- 'AnotherModule': {
380
- entry: './src/modules/another-module/index',
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
- 2. Изменить входную точку модуля:
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
- В целом, если ваше приложение и модули используют только css-modules, то можно использовать `default` режим. Конфликты в стилях
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-деревья, которые не будут влиять на 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.5.1",
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",