arui-scripts 0.0.0-next-20230725145300

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.
Files changed (170) hide show
  1. package/.browserslistrc +5 -0
  2. package/.turbo/turbo-build.log +0 -0
  3. package/.turbo/turbo-test.log +91 -0
  4. package/CHANGELOG.md +1032 -0
  5. package/README.md +716 -0
  6. package/bin/build.sh +2 -0
  7. package/build/bin/index.d.ts +3 -0
  8. package/build/bin/index.js +21 -0
  9. package/build/commands/archive-build/index.d.ts +1 -0
  10. package/build/commands/archive-build/index.js +80 -0
  11. package/build/commands/build/build-wrapper.d.ts +8 -0
  12. package/build/commands/build/build-wrapper.js +41 -0
  13. package/build/commands/build/client.d.ts +1 -0
  14. package/build/commands/build/client.js +41 -0
  15. package/build/commands/build/index.d.ts +1 -0
  16. package/build/commands/build/index.js +10 -0
  17. package/build/commands/build/server.d.ts +1 -0
  18. package/build/commands/build/server.js +29 -0
  19. package/build/commands/bundle-analyze/index.d.ts +1 -0
  20. package/build/commands/bundle-analyze/index.js +36 -0
  21. package/build/commands/changelog/index.d.ts +5 -0
  22. package/build/commands/changelog/index.js +116 -0
  23. package/build/commands/docker-build/index.d.ts +1 -0
  24. package/build/commands/docker-build/index.js +70 -0
  25. package/build/commands/docker-build-compiled/index.d.ts +1 -0
  26. package/build/commands/docker-build-compiled/index.js +52 -0
  27. package/build/commands/ensure-yarn/index.d.ts +0 -0
  28. package/build/commands/ensure-yarn/index.js +8 -0
  29. package/build/commands/start/client.d.ts +1 -0
  30. package/build/commands/start/client.js +8 -0
  31. package/build/commands/start/index.d.ts +1 -0
  32. package/build/commands/start/index.js +8 -0
  33. package/build/commands/start/print-compiler-output.d.ts +1 -0
  34. package/build/commands/start/print-compiler-output.js +15 -0
  35. package/build/commands/start/server.d.ts +1 -0
  36. package/build/commands/start/server.js +8 -0
  37. package/build/commands/start-prod/client.d.ts +1 -0
  38. package/build/commands/start-prod/client.js +8 -0
  39. package/build/commands/start-prod/index.d.ts +1 -0
  40. package/build/commands/start-prod/index.js +8 -0
  41. package/build/commands/start-prod/server.d.ts +1 -0
  42. package/build/commands/start-prod/server.js +8 -0
  43. package/build/commands/test/index.d.ts +3 -0
  44. package/build/commands/test/index.js +17 -0
  45. package/build/commands/util/check-required-files.d.ts +2 -0
  46. package/build/commands/util/check-required-files.js +67 -0
  47. package/build/commands/util/client-assets-sizes.d.ts +26 -0
  48. package/build/commands/util/client-assets-sizes.js +88 -0
  49. package/build/commands/util/docker-build.d.ts +21 -0
  50. package/build/commands/util/docker-build.js +89 -0
  51. package/build/commands/util/exec.d.ts +2 -0
  52. package/build/commands/util/exec.js +18 -0
  53. package/build/commands/util/format-webpack-messages.d.ts +11 -0
  54. package/build/commands/util/format-webpack-messages.js +93 -0
  55. package/build/commands/util/make-tmp-dir.d.ts +6 -0
  56. package/build/commands/util/make-tmp-dir.js +29 -0
  57. package/build/commands/util/run-client-dev-server.d.ts +2 -0
  58. package/build/commands/util/run-client-dev-server.js +47 -0
  59. package/build/commands/util/run-compilers.d.ts +1 -0
  60. package/build/commands/util/run-compilers.js +31 -0
  61. package/build/commands/util/run-server-watch-compiler.d.ts +2 -0
  62. package/build/commands/util/run-server-watch-compiler.js +21 -0
  63. package/build/commands/util/yarn.d.ts +5 -0
  64. package/build/commands/util/yarn.js +53 -0
  65. package/build/configs/app-configs/calculate-dependent-config.d.ts +76 -0
  66. package/build/configs/app-configs/calculate-dependent-config.js +37 -0
  67. package/build/configs/app-configs/get-defaults.d.ts +3 -0
  68. package/build/configs/app-configs/get-defaults.js +127 -0
  69. package/build/configs/app-configs/index.d.ts +6 -0
  70. package/build/configs/app-configs/index.js +22 -0
  71. package/build/configs/app-configs/types.d.ts +108 -0
  72. package/build/configs/app-configs/types.js +2 -0
  73. package/build/configs/app-configs/update-with-config-file.d.ts +2 -0
  74. package/build/configs/app-configs/update-with-config-file.js +23 -0
  75. package/build/configs/app-configs/update-with-env.d.ts +2 -0
  76. package/build/configs/app-configs/update-with-env.js +20 -0
  77. package/build/configs/app-configs/update-with-package.d.ts +2 -0
  78. package/build/configs/app-configs/update-with-package.js +10 -0
  79. package/build/configs/app-configs/update-with-presets.d.ts +2 -0
  80. package/build/configs/app-configs/update-with-presets.js +26 -0
  81. package/build/configs/app-configs/validate-settings-keys.d.ts +4 -0
  82. package/build/configs/app-configs/validate-settings-keys.js +14 -0
  83. package/build/configs/babel-client.d.ts +34 -0
  84. package/build/configs/babel-client.js +65 -0
  85. package/build/configs/babel-dependencies.d.ts +14 -0
  86. package/build/configs/babel-dependencies.js +39 -0
  87. package/build/configs/babel-server.d.ts +27 -0
  88. package/build/configs/babel-server.js +47 -0
  89. package/build/configs/config-extras/minimizers/imagemin/imagemin.d.ts +2 -0
  90. package/build/configs/config-extras/minimizers/imagemin/imagemin.js +42 -0
  91. package/build/configs/config-extras/minimizers/imagemin/index.d.ts +1 -0
  92. package/build/configs/config-extras/minimizers/imagemin/index.js +17 -0
  93. package/build/configs/config-extras/minimizers/index.d.ts +1 -0
  94. package/build/configs/config-extras/minimizers/index.js +17 -0
  95. package/build/configs/dev-server.d.ts +2 -0
  96. package/build/configs/dev-server.js +48 -0
  97. package/build/configs/jest/babel-transform.d.ts +2 -0
  98. package/build/configs/jest/babel-transform.js +4 -0
  99. package/build/configs/jest/css-mock.d.ts +1 -0
  100. package/build/configs/jest/css-mock.js +2 -0
  101. package/build/configs/jest/file-transform.d.ts +3 -0
  102. package/build/configs/jest/file-transform.js +9 -0
  103. package/build/configs/jest/index.d.ts +50 -0
  104. package/build/configs/jest/index.js +47 -0
  105. package/build/configs/modules.d.ts +16 -0
  106. package/build/configs/modules.js +101 -0
  107. package/build/configs/mq.css +22 -0
  108. package/build/configs/postcss.config.d.ts +25 -0
  109. package/build/configs/postcss.config.js +62 -0
  110. package/build/configs/postcss.d.ts +2 -0
  111. package/build/configs/postcss.js +9 -0
  112. package/build/configs/process-assets-plugin-output.d.ts +2 -0
  113. package/build/configs/process-assets-plugin-output.js +46 -0
  114. package/build/configs/server-externals-exemptions.d.ts +1 -0
  115. package/build/configs/server-externals-exemptions.js +21 -0
  116. package/build/configs/stats-options.d.ts +3 -0
  117. package/build/configs/stats-options.js +49 -0
  118. package/build/configs/supporting-browsers.d.ts +2 -0
  119. package/build/configs/supporting-browsers.js +13 -0
  120. package/build/configs/util/apply-overrides.d.ts +56 -0
  121. package/build/configs/util/apply-overrides.js +47 -0
  122. package/build/configs/util/check-node-version.d.ts +2 -0
  123. package/build/configs/util/check-node-version.js +7 -0
  124. package/build/configs/util/find-loader.d.ts +2 -0
  125. package/build/configs/util/find-loader.js +23 -0
  126. package/build/configs/util/get-entry.d.ts +9 -0
  127. package/build/configs/util/get-entry.js +22 -0
  128. package/build/configs/util/get-polyfills.d.ts +3 -0
  129. package/build/configs/util/get-polyfills.js +27 -0
  130. package/build/configs/util/install-sourcemap-support.d.ts +1 -0
  131. package/build/configs/util/install-sourcemap-support.js +7 -0
  132. package/build/configs/util/node-assets-ignore.d.ts +0 -0
  133. package/build/configs/util/node-assets-ignore.js +31 -0
  134. package/build/configs/util/noop.d.ts +1 -0
  135. package/build/configs/util/noop.js +2 -0
  136. package/build/configs/util/register-ts-node.d.ts +0 -0
  137. package/build/configs/util/register-ts-node.js +17 -0
  138. package/build/configs/util/resolve.d.ts +12 -0
  139. package/build/configs/util/resolve.js +30 -0
  140. package/build/configs/webpack.client.d.ts +10 -0
  141. package/build/configs/webpack.client.dev.d.ts +2 -0
  142. package/build/configs/webpack.client.dev.js +9 -0
  143. package/build/configs/webpack.client.js +402 -0
  144. package/build/configs/webpack.client.prod.d.ts +2 -0
  145. package/build/configs/webpack.client.prod.js +9 -0
  146. package/build/configs/webpack.server.d.ts +2 -0
  147. package/build/configs/webpack.server.dev.d.ts +2 -0
  148. package/build/configs/webpack.server.dev.js +9 -0
  149. package/build/configs/webpack.server.js +229 -0
  150. package/build/configs/webpack.server.prod.d.ts +2 -0
  151. package/build/configs/webpack.server.prod.js +9 -0
  152. package/build/index.d.ts +5 -0
  153. package/build/index.js +9 -0
  154. package/build/plugins/reload-server-webpack-plugin.d.ts +9 -0
  155. package/build/plugins/reload-server-webpack-plugin.js +42 -0
  156. package/build/templates/dockerfile-compiled.template.d.ts +2 -0
  157. package/build/templates/dockerfile-compiled.template.js +47 -0
  158. package/build/templates/dockerfile.template.d.ts +2 -0
  159. package/build/templates/dockerfile.template.js +32 -0
  160. package/build/templates/nginx.conf.template.d.ts +2 -0
  161. package/build/templates/nginx.conf.template.js +34 -0
  162. package/build/templates/start.template.d.ts +2 -0
  163. package/build/templates/start.template.js +37 -0
  164. package/build/tsconfig-local.tsbuildinfo +1 -0
  165. package/docs/modules.md +572 -0
  166. package/jest-preset.js +22 -0
  167. package/package.json +172 -0
  168. package/release.config.js +21 -0
  169. package/tsconfig-local.json +16 -0
  170. package/tsconfig.json +71 -0
package/README.md ADDED
@@ -0,0 +1,716 @@
1
+ ARUI-scripts
2
+ ===
3
+
4
+ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ инструмСнт для ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ сборки клиСнтской ΠΈ сСрвСрной части react-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
5
+
6
+ ИспользованиС
7
+ ===
8
+
9
+ 0. ΠŸΠ°ΠΊΠ΅Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вСрсии:
10
+
11
+ Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ | ВСрсия
12
+ -- | --
13
+ `nodejs` | `12.13.0+`
14
+ `react` | `16.13.0+`
15
+ `react-dom` | `16.13.0+`
16
+
17
+ 1. УстановитС `arui-scripts` Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ dev Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ
18
+
19
+ ```bash
20
+ yarn add arui-scripts --dev
21
+ ```
22
+ ΠΈΠ»ΠΈ
23
+ ```bash
24
+ npm install arui-scripts --save-dev
25
+ ```
26
+
27
+ 2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
28
+ - `src/index.{js,jsx,ts,tsx}` - входная Ρ‚ΠΎΡ‡ΠΊΠ° для клиСнтского прилоТСния.
29
+ - `src/server/index.{js,jsx,tsx}` - входная Ρ‚ΠΎΡ‡ΠΊΠ° для сСрвСрного прилоТСния.
30
+ - `node_modules/arui-feather/polyfills` - ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ для клиСнтского прилоТСния.
31
+
32
+ ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти ΠΏΡƒΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ настроСк.
33
+
34
+ 3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· `arui-scripts`!
35
+
36
+ ДоступныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
37
+ ---
38
+
39
+ - `arui-scripts start` - запускаСт WebpackDevServer для Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° ΠΈ webpack Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ `--watch` для сСрвСра.
40
+ - `arui-scripts start:prod` - Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅ start, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ production Π²Π΅Ρ€ΡΠΈΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для webpack. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для сбора ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
41
+ - `arui-scripts build` - ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр для использования Π² production
42
+ - `arui-scripts docker-build` - собираСт docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ c production Π±ΠΈΠ»Π΄ΠΎΠΌ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π°Ρ€Ρ‚ΠΈΡ„Π°ΠΊΡ‚ΠΎΡ€ΠΈ
43
+ - `arui-scripts docker-build:compiled` - собираСт docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ c production Π±ΠΈΠ»Π΄ΠΎΠΌ, прСдполагая Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ прилоТСния ΡƒΠΆΠ΅ скомпилирован
44
+ - `arui-scripts test` - запускаСт jest тСсты.
45
+ - `arui-scripts archive-build` - собираСт Π°Ρ€Ρ…ΠΈΠ² с production Π±ΠΈΠ»Π΄ΠΎΠΌ
46
+ - `arui-scripts bundle-analyze` - запускаСт [webpack-bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer) для prod вСрсии клиСнтского ΠΊΠΎΠ΄Π°
47
+ - `arui-scripts changelog` - запускаСт скрипт changelog Ρ‡Π΅Ρ€Π΅Π· standard-version, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Π½ΠΎΠ²ΠΎΠ΅ описаниС Π² `CHANGELOG.MD`, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€ΠΈ сборкС Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±ΠΈΠ»Π΄Π° Π² Jenkins
48
+
49
+
50
+ Настройки
51
+ ---
52
+
53
+ НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ настройки сборщиков.
54
+ Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ Π² `package.json`, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρ‚Π°ΠΌ свойство `aruiScripts`, ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ»
55
+ `arui-scripts.config.(js|ts)`.
56
+
57
+ ДоступныС настройки:
58
+
59
+ - `dockerRegistry` - адрСс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ docker registry, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `''`, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ registry
60
+ - `baseDockerImage` - имя Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для построСния docker ΠΎΠ±Ρ€Π°Π·Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `alfabankui/arui-scripts:latest`.
61
+ - `runFromNonRootUser` - сборка ΠΎΠ±Ρ€Π°Π·Π° ΠΏΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ `nginx`. НуТна для совмСстимости с k8s, Ρ‚.ΠΊ Ρ‚Π°ΠΌ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ запуск ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈΠ· ΠΏΠΎΠ΄ `root` По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
62
+ - `serverEntry` - Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° для исходников сСрвСра, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `src/server/index`.
63
+ - `serverOutput` - имя Ρ„Π°ΠΉΠ»Π° для компиляции сСрвСра, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `server.js`.
64
+ - `clientPolyfillsEntry` - Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° для ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»ΠΎΠ². Π‘ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ основной Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ подтягиваСт ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ ΠΈΠ· `arui-feather`, Ссли ΠΎΠ½ установлСн.
65
+ - `clientEntry` - Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° для клиСнтского прилоТСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `src/index.js`.
66
+ - `useServerHMR` - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ HotModuleReplacement для сСрвСра. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
67
+ - `webpack4Compatibility` - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π»ΠΈ Ρ€Π΅ΠΆΠΈΠΌ совмСстимости с webpack 4. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² [этом issue](https://github.com/webpack/webpack/issues/14580).
68
+ - `clientServerPort` - ΠΏΠΎΡ€Ρ‚ WebpackDevServer ΠΈ nginx ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `8080`.
69
+ - `serverPort` - ΠΏΠΎΡ€Ρ‚ Π½ΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ сСрвСра. НуТСн для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ проксирования запросов ΠΎΡ‚ Π΄Π΅Π² сСрвСра ΠΈ nginx. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `3000`.
70
+ - `installServerSourceMaps` - Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π»ΠΈ Π² ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ сборку ΠΏΠ°ΠΊΠ΅Ρ‚ `source-map-support`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
71
+ - `additionalBuildPath` - массив ΠΏΡƒΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π² Π°Ρ€Ρ…ΠΈΠ² ΠΏΡ€ΠΈ использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `archive-build`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `['config']`.
72
+ - `archiveName` - имя Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΏΡ€ΠΈ использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `archive-build`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `build.tar`.
73
+ - `keepPropTypes` - Ссли `true`, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с prop-types Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· production Π±ΠΈΠ»Π΄Π°.
74
+ - `debug` - Ρ€Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ выводится большС сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
75
+ - `statsOutputFilename` - имя [stats-Ρ„Π°ΠΉΠ»Π°](https://webpack.js.org/api/stats/), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² [bundle-analyze](#Π°Π½Π°Π»ΠΈΠ·-Π±Π°Π½Π΄Π»Π°) ΠΊΠΎΠΌΠ°Π½Π΄Π΅
76
+ - `devSourceMaps` - ΠΊΠ°ΠΊΠΎΠΉ Π²ΠΈΠ΄ source-map ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `eval`. Π­Ρ‚Π° настройка ΠΌΠΎΠΆΠ΅Ρ‚ сильно Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° врСмя сборки. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ [здСсь](https://webpack.js.org/configuration/devtool/).
77
+ **Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅**. ΠŸΡ€ΠΈ использовании Π»ΡŽΠ±Ρ‹Ρ… source-map Π½Π° основании `eval` webpack-dev-server Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `Content-Security-Policy` (ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ) ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ `unsafe-eval`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ‚ΡƒΡ‚](#dev-csp).
78
+ - `useTscLoader` - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ts-loader вмСсто babel-loader для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ts Ρ„Π°ΠΉΠ»ΠΎΠ². Π£ babel-loader Π΅ΡΡ‚ΡŒ [ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ](https://blogs.msdn.microsoft.com/typescript/2018/08/27/typescript-and-babel-7/). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
79
+ - `componentsTheme` - ΠΏΡƒΡ‚ΡŒ ΠΊ css Ρ„Π°ΠΉΠ»Ρƒ с Ρ‚Π΅ΠΌΠΎΠΉ для [core-components](https://github.com/core-ds/core-components). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для настройки [postcss-custom-properties](https://github.com/postcss/postcss-custom-properties#importfrom).
80
+ - `keepCssVars` - ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ `postcss-custom-properties`, css ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π±Π°Π½Π΄Π»Π΅.
81
+ - `removeDevDependenciesDuringDockerBuild` - ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ devDependencies ΠΈΠ· node_modules ΠΏΡ€ΠΈ сборкС Π΄ΠΎΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ devDependencies, Ρ‚.ΠΊ. Π² своём Dockerfile Π²Ρ‹ Π½Π΅ пСрСноситС node_modules Π² Π΄ΠΎΠΊΠ΅Ρ€-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.
82
+ - `dataUrlMaxSize` - рСсурсы, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…), Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² исходники `inline`, ΠΈΠ½Π°Ρ‡Π΅ вынСсСны Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `1536`.
83
+ - `imageMinimizer` - Ρ€Π°Π·Π΄Π΅Π» настроСк, связанных с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.
84
+ - `imageMinimizer.svg.enabled` - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ `svg`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `true`.
85
+ - `imageMinimizer.gif.enabled` - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ `gif`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
86
+ - `imageMinimizer.gif.optimizationLevel` - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сТатия `gif`. ΠžΡ‚ `1` Π΄ΠΎ `3`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `1`.
87
+ - `imageMinimizer.jpg.enabled` - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ `jpg`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`.
88
+ - `imageMinimizer.jpg.quality` - качСство Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠžΡ‚ `0` Π΄ΠΎ `100`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `75`.
89
+ - `imageMinimizer.png.enabled` - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ `png`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`. О структурС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° png ΠΈ влиянии описанных Π΄Π°Π»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ [здСсь](https://www.w3.org/TR/PNG-Chunks.html)
90
+ - `imageMinimizer.png.optimizationLevel` - ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сТатия `png`. ΠžΡ‚ `0` Π΄ΠΎ `7`. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `3`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](https://github.com/imagemin/imagemin-optipng#optimizationlevel)
91
+ - `imageMinimizer.png.bitDepthReduction` - допускаСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ Ρ†Π²Π΅Ρ‚Π° изобраТСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](https://github.com/imagemin/imagemin-optipng#bitdepthreduction)
92
+ - `imageMinimizer.png.colorTypeReduction` - допускаСт ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ прСдставлСния изобраТСния (ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΈ сСрого / ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ / ΠΏΡ€.). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](https://github.com/imagemin/imagemin-optipng#colortypereduction)
93
+ - `imageMinimizer.png.paletteReduction` - допускаСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ изобраТСния. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `false`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](https://github.com/imagemin/imagemin-optipng#palettereduction)
94
+ - `imageMinimizer.png.interlaced` - ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ порядок ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ изобраТСния. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](https://github.com/imagemin/imagemin-optipng#interlaced)
95
+ - `devServerCors` - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ cors-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π² dev-server. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ локальном тСстировании ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
96
+ - `embeddedModules`, `mfModules` - позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с модулями, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ [ΠœΠΎΠ΄ΡƒΠ»ΠΈ](./docs/modules.md).
97
+
98
+ Π’ цСлях ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ всС эти настройки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ измСняя package.json
99
+ ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ настройки Π² environment ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ARUI_SCRIPTS_CONFIG
100
+ ```
101
+ ARUI_SCRIPTS_CONFIG="{\"serverPort\":3333}" yarn start
102
+ ```
103
+
104
+ Π’Π°ΠΊ ΠΆΠ΅, Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ настройки jest (см. [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ](https://facebook.github.io/jest/docs/en/configuration.html))
105
+ ΠΈ `proxy` (см. [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ](https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#proxying-api-requests-in-development)).
106
+
107
+ ИспользованиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²
108
+ ---
109
+ Для слоТных ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ вынСсти ΠΈΡ… ΠΈΠ· package.json Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
110
+ `arui-scripts.config.js` ΠΈΠ»ΠΈ `arui-scripts.config.ts`
111
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ `arui-scripts.config.ts`:
112
+ ```ts
113
+ import { PackageSettings } from 'arui-scripts';
114
+
115
+ const settings: PackageSettings = {
116
+ clientEntry: {
117
+ mobile: './src/mobile',
118
+ desktop: './src/desktop',
119
+ },
120
+ };
121
+
122
+ export default settings;
123
+ ```
124
+
125
+ НСсколько entry point
126
+ ---
127
+ ΠšΠ»ΡŽΡ‡ΠΈ `serverEntry` ΠΈ `clientEntry` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строки, Π½ΠΎ ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π² [webpack Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹](https://webpack.js.org/concepts/entry-points/).
128
+ НапримСр, package.json:
129
+ ```json
130
+ {
131
+ "aruiScripts": {
132
+ "clientEntry": { "mobile": "src/mobile/", "desktop": "src/desktop/" },
133
+ "serverEntry": ["src/server-prepare", "src/server"]
134
+ }
135
+ }
136
+ ```
137
+
138
+ Ко всСм клиСнтским entryPoint Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ `clientPolyfillsEntry` (Ссли Π·Π°Π΄Π°Π½)
139
+ ΠΈ, Π² dev Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для hot-module-reload Ρ„Π°ΠΉΠ»Ρ‹.
140
+
141
+ ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ настроСк компиляторов
142
+ ---
143
+
144
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для компиляции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Babel, для пСрСопрСдСлСния ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» `.babelrc` Π² Ρ€ΡƒΡ‚ ΠΏΠ°ΠΏΠΊΡƒ своСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
145
+ TypeScript ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, ΠΏΠΎΠ»ΠΎΠΆΠΈΠ² `tsconfig.json` Π² ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
146
+
147
+ ΠŸΡƒΡ‚ΠΈ Π΄ΠΎ ассСтов
148
+ ---
149
+ Π’ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ вСрсии Π±ΠΈΠ»Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ созданно Π΄Π²Π° Π±Π°Π½Π΄Π»Π° `vendor.[hash].js` ΠΈ `main.[hash].js`. Для
150
+ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ html с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ этих ассСтов Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» `webpack-assets.json`
151
+ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² ΠΏΠ°ΠΏΠΊΡƒ со скомпилированным ΠΊΠΎΠ΄ΠΎΠΌ.
152
+
153
+ `vendor.js` Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π²Π°ΠΌΠΈ `node_modules`, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТится `arui`.
154
+
155
+ `main.js` содСрТит всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅.
156
+
157
+ Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ваши ассСты Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС, `vendor.js` Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π”Πž `main.js`.
158
+
159
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая сформируСт отсортированныС Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС массивы для js ΠΈ css Ρ„Π°ΠΉΠ»ΠΎΠ²:
160
+ ```js
161
+ function readAssetsManifest() {
162
+ // Ρ‡ΠΈΡ‚Π°Π΅ΠΌ манифСст
163
+ const manifestPath = path.join(process.cwd(), '.build/webpack-assets.json');
164
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
165
+
166
+ const js = [];
167
+ const css = [];
168
+ // vendor Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ΄Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ main
169
+ ['vendor', 'main'].forEach((key) => {
170
+ if (!manifest[key]) { // Π² Π΄Π΅Π² сборкС vendor.js Π½Π΅ формируСтся
171
+ return;
172
+ }
173
+ if (manifest[key].js) {
174
+ js.push(manifest[key].js);
175
+ }
176
+ if (manifest[key].css) {
177
+ css.push(manifest[key].css);
178
+ }
179
+ });
180
+
181
+ return {
182
+ js, css
183
+ };
184
+ }
185
+ ```
186
+
187
+ ИспользованиС hot-module-replacement
188
+ ---
189
+ #### ΠšΠ»ΠΈΠ΅Π½Ρ‚:
190
+
191
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ css. Для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с react Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
192
+ ```jsx harmony
193
+ import React from 'react'
194
+ import ReactDOM from 'react-dom'
195
+ import App from './app';
196
+
197
+ ReactDOM.render(
198
+ <App />,
199
+ document.getElementById('react-app')
200
+ );
201
+ if (module.hot) {
202
+ module.hot.accept('./app', () => {
203
+ const NextAppAssignments = require('./app').default;
204
+ ReactDOM.render(
205
+ <NextAppAssignments />,
206
+ document.getElementById('react-app')
207
+ );
208
+ });
209
+ }
210
+ ```
211
+
212
+ #### Π‘Π΅Ρ€Π²Π΅Ρ€
213
+ БСрвСрная Ρ‡Π°ΡΡ‚ΡŒ прилоТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ измСнСния ΠΊΠΎΠ΄Π°,
214
+ для использования hot module replacement Π½Π° сСрвСрС Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько Π²Π΅Ρ‰Π΅ΠΉ:
215
+
216
+ Π’ `package.json` Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ:
217
+ ```json
218
+ {
219
+ "aruiScripts": { "useServerHMR": true }
220
+ }
221
+ ```
222
+
223
+ Π’Π°ΡˆΠ° входная Ρ‚ΠΎΡ‡ΠΊΠ° сСрвСра Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ hapi):
224
+ ##### server/index.js
225
+ ```js
226
+ import server from './server';
227
+
228
+ let currentServer = server;
229
+
230
+ async function startServer() {
231
+ try {
232
+ await currentServer.start();
233
+ } catch (error) {
234
+ console.error('Failed to start server', error);
235
+ process.exit(1);
236
+ }
237
+ }
238
+
239
+ startServer();
240
+
241
+ if (module.hot) {
242
+ module.hot.accept(['./server'], async () => {
243
+ try {
244
+ await currentServer.stop();
245
+
246
+ currentServer = server; // ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΈΠ· сСрвСра замСнится ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ
247
+ await startServer();
248
+ } catch (error) {
249
+ console.log('Failed to update server. You probably need to restart application', error);
250
+ }
251
+ });
252
+ }
253
+ ```
254
+ ##### server/server.js
255
+ ```js
256
+ import hapi from 'hapi';
257
+ const server = new hapi.Server();
258
+
259
+ server.ext('onPostStart', (_, done) => {
260
+ console.log(`Server is running: ${server.info.uri}`);
261
+ done();
262
+ });
263
+
264
+ (async () => {
265
+ server.connection({ port: 3000 });
266
+
267
+ // ...
268
+ // конфигурация вашСго сСрвСра
269
+ // ...
270
+ })();
271
+
272
+ export default server;
273
+ ```
274
+
275
+ Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ послС измСнСния ΠΊΠΎΠ΄Π° сСрвСр Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€Π΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях быстрСС.
276
+ Π’ случаС измСнСния Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ сСрвСра ΠΏΡ€ΠΈ использовании HMR Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.
277
+
278
+ ВСсты
279
+ ---
280
+ Команда `arui-scripts test` Π²Π½ΡƒΡ‚Ρ€ΠΈ запускаСт jest с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ.
281
+
282
+ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя:
283
+ - ИспользованиС `jest-snapshot-serializer-class-name-to-string` для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с `cn`
284
+ - Π—Π°ΠΌΠ΅Π½Ρƒ всСх ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ² css Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° пустыС Ρ„Π°ΠΉΠ»Ρ‹
285
+ - ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ .js/.jsx Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ babel
286
+ - ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ .ts/.tsx Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ tsc
287
+ - Π—Π°ΠΌΠ΅Π½Ρƒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚ строк с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π°
288
+
289
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄ маску для поиска тСстов ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ всС Ρ„Π°ΠΉΠ»Ρ‹ `*test*.(js|jsx|ts|tsx)`, `*spec*.((js|jsx|ts|tsx))`, `*/__test__/*.(js|jsx|ts|tsx)`.
290
+
291
+ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ настройки jest Π² `package.json`, [докумСнтация](https://facebook.github.io/jest/docs/en/configuration.html).
292
+
293
+ Если ΠΊΠ°ΠΊΠΈΠ΅ Π»ΠΈΠ±ΠΎ ΠΈΠ· Π²Π°ΡˆΠΈΡ… инструмСнтов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ VSΠ‘ode ΠΈΠ»ΠΈ WebStorm) Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ тСсты ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ находят ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ `arui-scripts` ΠΊΠ°ΠΊ preset для jest.
294
+ Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ запуск тСстов Ρ‡Π΅Ρ€Π΅Π· arui-script, Ρ‚Π°ΠΊ ΠΈ Π»ΡŽΠ±Ρ‹Π΅ сторонниС инструмСнты, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ jest.
295
+
296
+ ##### package.json
297
+ ```json
298
+ {
299
+ "jest": {
300
+ "preset": "arui-scripts"
301
+ }
302
+ }
303
+ ```
304
+
305
+ docker
306
+ ---
307
+
308
+ Команда `arui-scripts docker-build` запускаСт ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ вСрсии ΠΈ сборку Π΄ΠΎΠΊΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·Π°.
309
+
310
+ ΠžΠ±Ρ€Π°Π· основан Π½Π° [alpine-node-nginx](../alpine-node-nginx).
311
+
312
+ Имя ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° опрСдСляСтся ΠΊΠ°ΠΊ `{configs.dockerRegistry}/{name}:{version}`. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ `name` ΠΈ `version` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ бСрутся ΠΈΠ· package.json,
313
+ Π½ΠΎ Π²Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€
314
+ `arui-scripts docker-build name=container-name version=0.1-beta`
315
+
316
+ Команда ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ установлСнных `node_modules` ΠΏΠ΅Ρ€Π΅Π΄ сборкой, Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΆΠ΅ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Π΄Π΅Π² зависимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `yarn` ΠΈΠ»ΠΈ `npm`.
317
+ yarn Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ³Π΄Π° Π² Ρ€ΡƒΡ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ `yarn.lock` ΠΈ `yarn` доступСн Π² систСмС.
318
+ Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ yarn 2, для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ очистки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ [workspace-tools](https://github.com/yarnpkg/berry/blob/HEAD/packages/plugin-workspace-tools/README.md), поэтому ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн ΠΈ ΡƒΠΊΠ°Π·Π°Π½ Π² `.yarnrc.yml` вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
319
+
320
+ Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ `nginx` ΠΈ скрипт для запуска `nginx` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с `nodejs` сСрвСром.
321
+
322
+ Π’ ΠΈΡ‚ΠΎΠ³Π΅, для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ запуска вашСго Π΄ΠΎΠΊΠ΅Ρ€-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ
323
+
324
+ ```
325
+ docker run -p 8080:8080 container-name:version ./start.sh
326
+ ```
327
+
328
+ На `8080` ΠΏΠΎΡ€Ρ‚Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ поднят nginx, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π°Π²Π°Ρ‚ΡŒ статику ΠΈ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ запросы ΠΊ `nodejs`.
329
+
330
+ Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ процСсс сборки docker-ΠΎΠ±Ρ€Π°Π·Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ [overrides](#тонкая-настройка)
331
+ ΠΈΠ»ΠΈ создав Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° `Dockerfile` содСрТащий Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструкций.
332
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ [Dockerfile](src/templates/dockerfile.template.ts).
333
+
334
+ `Dockerfile` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ overrides.
335
+
336
+ Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ скрипт запуска, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ [overrides](#тонкая-настройка)
337
+ ΠΈΠ»ΠΈ создайтС Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° `start.sh` Ρ„Π°ΠΉΠ» содСрТащий Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструкций.
338
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ [start.sh](src/templates/start.template.ts).
339
+
340
+ `start.sh` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ overrides.
341
+
342
+ docker compiled
343
+ ---
344
+ Команда `arui-scripts docker-build:compiled` Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° `docker-build`, Π½ΠΎ вмСсто сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΠΆΠ΅ скомпилированный Π² ΠΏΠ°ΠΏΠΊΡƒ `.build` ΠΊΠΎΠ΄.
345
+ ΠŸΡ€ΠΈ этом Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ production зависимости.
346
+ ΠšΠΎΠΌΠ°Π½Π΄Ρƒ прСдполагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² CI/CD, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ собираСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ шагС ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сборки ΡƒΠΆΠ΅ доступСн.
347
+ Π—Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠ°ΠΏΠΊΠΈ node_modules Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ production зависимости, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ сборки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ увСличиваСтся.
348
+ Π’ процСссС сборки Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» `.dockerignore` для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ `node_modules` ΠΈΠ· контСкста сборки Π΄ΠΎΠΊΠ΅Ρ€Π°.
349
+
350
+ `arui-scripts docker-build:compiled` ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ `arui-scripts docker-build`.
351
+ Dockerfile ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован автоматичСски, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ [overrides](#тонкая-настройка).
352
+ Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `Dockerfile` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ игнорируСтся.
353
+
354
+ archive
355
+ ---
356
+
357
+ Команда `arui-scripts archive-build` запускаСт ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ вСрсии ΠΈ сборку Π°Ρ€Ρ…ΠΈΠ²Π° со скомпилированным ΠΊΠΎΠ΄ΠΎΠΌ.
358
+
359
+ Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° Π² ΠΌΠ°Ρ€Π°Ρ„ΠΎΠ½Π΅.
360
+
361
+ Команда ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ установлСнных `node_modules` ΠΏΠ΅Ρ€Π΅Π΄ сборкой, Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΆΠ΅ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Π΄Π΅Π² зависимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `yarn` ΠΈΠ»ΠΈ `npm`.
362
+ yarn Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ³Π΄Π° Π² Ρ€ΡƒΡ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ `yarn.lock` ΠΈ `yarn` доступСн Π² систСмС.
363
+ Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ yarn 2, для выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ очистки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ [workspace-tools](https://github.com/yarnpkg/berry/blob/HEAD/packages/plugin-workspace-tools/README.md), поэтому ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн ΠΈ ΡƒΠΊΠ°Π·Π°Π½ Π² `.yarnrc.yml` вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
364
+
365
+ Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² сСбС `.build`, `node_modules`, `package.json` ΠΈ `config` ΠΏΠ°ΠΏΠΊΠΈ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
366
+
367
+ ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ запросов Π΄ΠΎ бэкСнда.
368
+ ---
369
+
370
+ Π’ случаС, Ссли ваш Ρ„Ρ€ΠΎΠ½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ API, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΎΡ‚ вашСго nodejs сСрвСра, Π² Π΄Π΅Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ проксированиС запросов.
371
+ Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство `proxy` Π² вашСм `package.json`.
372
+
373
+ НапримСр:
374
+
375
+ ```json
376
+ {
377
+ "proxy": {
378
+ "/corp-shared-ui": {
379
+ "target": "http://corpint4",
380
+ "headers": {
381
+ "host": "corpint4"
382
+ }
383
+ }
384
+ }
385
+ }
386
+ ```
387
+
388
+ Вакая конфигурация Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΊ `http://localhost:8080/corp-shared-ui/` Π½Π° `http://corpint4/corp-shared-ui`.
389
+ ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прокси сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² [Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Webpack](https://webpack.js.org/configuration/dev-server/#devserver-proxy).
390
+
391
+ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ typescript
392
+ ---
393
+
394
+ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ TS Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, Ссли Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» `tsconfig.json`.
395
+ Π—Π° основу ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³:
396
+
397
+ ```json
398
+ {
399
+ "extends": "./node_modules/arui-scripts/tsconfig.json"
400
+ }
401
+ ```
402
+
403
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ TS Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· babel, Π½ΠΎ Ρƒ этого Π΅ΡΡ‚ΡŒ ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ:
404
+ - нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ namespace
405
+ - НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ синтаксис import/export (`import foo = require(...)`, `export = foo`)
406
+ - enum merging
407
+
408
+ Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€ΠΈΡ‡ΠΈΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ - Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ использованию tsc для компиляции ts Ρ„Π°ΠΉΠ»ΠΎΠ²
409
+
410
+ ```json
411
+ {
412
+ "aruiScripts": { "useTscLoader": true }
413
+ }
414
+ ```
415
+
416
+ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ nginx
417
+ ---
418
+
419
+ НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ nginx ΠΈΠΌΠ΅Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ с Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³ΠΎΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ свои Ρ€ΠΎΡƒΡ‚Ρ‹.
420
+ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ [overrides](#тонкая-настройка).
421
+ Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ `nginx.conf` Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° со своими Ρ€ΠΎΡƒΡ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° [Ρ‚ΡƒΡ‚](src/templates/nginx.conf.template.ts).
422
+ Π€Π°ΠΉΠ» nginx.conf ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Π°ΠΌΠΈ.
423
+
424
+
425
+ ИспользованиС env ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² nginx.conf
426
+ ---
427
+ Иногда Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΈΠ· настроСк nginx Π² зависимости
428
+ ΠΎΡ‚ срСды, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π² свой `nginx.conf` ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π² ENV ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
429
+ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конфигурация nginx прогоняСтся ΠΏΡ€ΠΈ стартС
430
+ Ρ‡Π΅Ρ€Π΅Π· [envsubst](https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html).
431
+
432
+ Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ свой Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ docker-ΠΎΠ±Ρ€Π°Π· для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ доступСн `envsubst`.
433
+ Для alpine ΠΎΠ½ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΠ°ΠΊΠ΅Ρ‚Π° [`gettext`](https://pkgs.alpinelinux.org/contents?branch=edge&name=gettext&arch=x86&repo=main)
434
+
435
+ **Π’Π°ΠΆΠ½ΠΎ**. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… nginx, Ρ‚ΠΈΠΏΠ° `$proxy_add_x_forwarded_for`
436
+ ΠΏΠ΅Ρ€Π΅Π΄ запуском envsubst ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° `~~proxy_add_x_forwarded_for~~`, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π² исходный Π²ΠΈΠ΄.
437
+ envsubst Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ записанныС **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ** ΠΊΠ°ΠΊ `${MY_VAR}`.
438
+
439
+
440
+ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊ:
441
+
442
+ ```nginx.conf
443
+ server {
444
+ listen 8080;
445
+ server_name ${SERVICE_NAME};
446
+ ...
447
+ }
448
+ ```
449
+
450
+ ```shell
451
+ docker run my-awesome-app --env SERVICE_NAME=my-app
452
+ ```
453
+
454
+ ПослС запуска nginx Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ server_name `my-app`.
455
+
456
+ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ proptypes
457
+ ---
458
+
459
+ Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² production Ρ€Π΅ΠΆΠΈΠΌΠΈ proptypes Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ, ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· production сборки.
460
+
461
+ Π‘Π°ΠΌΠΈ объявлСния proptypes ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [babel-plugin-transform-react-remove-prop-types](https://www.npmjs.com/package/babel-plugin-transform-react-remove-prop-types).
462
+ Но ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² `prop-types` ΠΏΡ€ΠΈ этом Π½Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ. Π§Ρ‚ΠΎΠ±Ρ‹ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `webpack.NormalModuleReplacementPlugin`.
463
+ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΏΡƒΡΡ‚Ρ‹ΡˆΠΊΡƒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ΄ маску:
464
+
465
+ - `/^react-style-proptype$/`
466
+ - `/^thrift-services\/proptypes/`
467
+
468
+ Если, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния - Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² `package.json`:
469
+
470
+ ```json
471
+ {
472
+ "aruiScripts": {
473
+ "keepPropTypes": true
474
+ }
475
+ }
476
+ ```
477
+
478
+ <a name="node-externals"></a>
479
+
480
+ require Π½Π΅ js Ρ„Π°ΠΉΠ»ΠΎΠ² Π² node_modules Π² node.js
481
+ ---
482
+ Π‘Π±ΠΎΡ€ΠΊΠ° сСрвСрной части устроСна Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ `node_modules` Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² сборку (Π² Ρ„Π°ΠΉΠ» `.build/server.js`),
483
+ Π° загруТаСтся стандартным `require` node.js.
484
+ Основной ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ для это ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ старыС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ "странныС" Π²Π΅Ρ‰ΠΈ с require - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ
485
+ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ динамичСски, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ `require.extensions` ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ошибкам сборки ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊ
486
+ ошибкам Π²ΠΎ врСмя выполнСния.
487
+
488
+ Но Π² случаС react-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΌΡ‹ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΅Ρ‰Π΅ ΠΈ `.css`, `.png` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹.
489
+ `require` ΠΈΠ· node.js Π½Π° Ρ‚Π°ΠΊΠΈΡ… мСстах ломаСтся. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ наши Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² всС ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π²
490
+ собранный Ρ„Π°ΠΉΠ» `.build/server.js`. Всё это сдСлано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [добавлСния ΠΈΡ… Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅](src/configs/webpack.server.dev.ts#L59)
491
+ ΠΏΠ»Π°Π³ΠΈΠ½Π° [webpack-node-externals](https://www.npmjs.com/package/webpack-node-externals).
492
+ Π’ случаС, Ссли Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅-js Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ - Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅
493
+ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ `overrides`, ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ `serverExternalsExemptions`.
494
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΆΠ΅ всС Π½Π΅-js Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.
495
+
496
+ ΠšΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ»Π΄Π°
497
+ ---
498
+ Π’ dev сборкС для сСрвСра ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° настроСно ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Оно Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ просто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅
499
+ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ - мСняСтС ваш ΠΊΠΎΠ΄, ставитС Π½ΠΎΠ²Ρ‹Π΅ зависимости ΠΈ Ρ‚Π΄.
500
+
501
+ Но ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€ΡƒΠΊΠ°ΠΌΠΈ мСняСтС ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ node_modules - Π²Ρ‹ Π½Π΅ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ваши измСнСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ webpack Π±ΡƒΠ΄Π΅Ρ‚
502
+ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· кСша. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваши измСнСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡŒ Π² сборкС Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ кСш
503
+ webpack ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сборку. КСши хранятся Π² ΠΏΠ°ΠΏΠΊΠ΅ `.cache` Π²Π½ΡƒΡ‚Ρ€ΠΈ `node_modules` вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
504
+
505
+ ```
506
+ rm -rf ./node_modules/.cache
507
+ ```
508
+
509
+ <a name="dev-csp"></a>
510
+ ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ CSP для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
511
+ ---
512
+ Если Π² Π΄Π΅Π²-Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ любой Ρ‚ΠΈΠΏ source-map, основанный Π½Π° eval (это Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅) - Ρ‚ΠΎ
513
+ webpack-dev-server автоматичСски Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² CSP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ `script-src` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `unsafe-eval` (ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°).
514
+ Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π²ΠΎΠΎΠ±Ρ‰Π΅ запускался Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π­Ρ‚ΠΎ Π½Π΅ влияСт Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ прилоТСния, Ρ‚Π°ΠΊ
515
+ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π’ΠžΠ›Π¬ΠšΠž Π² Π΄Π΅Π²-Ρ€Π΅ΠΆΠΈΠΌΠ΅. Если ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ вас Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ устраиваСт - Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ
516
+ Ρ‚ΠΈΠΏ source-map Π½Π° любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ eval.
517
+
518
+
519
+ Анализ бандла
520
+ ---
521
+ Для изучСния ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Π½Π΄Π»Π° прилоТСния ΠΈ просмотра Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² arui-scripts Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π°
522
+ ```
523
+ arui-scripts bundle-analyze
524
+ ```
525
+ Она запускаСт [webpack-bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer) для клиСнтского ΠΊΠΎΠ΄Π°.
526
+ Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΈ запускС Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ [stats-Ρ„Π°ΠΉΠ»](https://webpack.js.org/api/stats/), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²
527
+ [сторонних](http://webpack.github.io/analyse/) инструмСнтах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для понимания ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΠΎΠΏΠ°Π» Π² Π±Π°Π½Π΄Π».
528
+ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π² `.build/stats.json`.
529
+
530
+ Вонкая настройка
531
+ ===
532
+ Если Π²Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ гибкости ΠΏΡ€ΠΈ использовании `arui-scripts`, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свой ΠΏΠ»Π°Π³ΠΈΠ½ для Π²Π΅Π±ΠΏΠ°ΠΊΠ° -
533
+ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ `overrides`.
534
+
535
+ Для этого Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² ΠΊΠΎΡ€Π½Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ„Π°ΠΉΠ» `arui-scripts.overrides.js` ΠΈΠ»ΠΈ `arui-scripts.overrides.ts`, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ смоТСтС ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ
536
+ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΡ‡Ρ‚ΠΈ всСх инструмСнтов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² `arui-scripts`.
537
+
538
+ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΡƒΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ. Для всСх ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² `arui-scripts.overrides.js`,
539
+ Π’ случаС Ссли Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ»ΡŽΡ‡ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ это функция - ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°, ΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹
540
+ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ конфигурация ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ прилоТСния (см [AppConfig](./src/configs/app-configs/types.ts)).
541
+ Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ такая функция Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.
542
+
543
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ `arui-scripts.overrides.js`:
544
+ ```javascript
545
+ const path = require('path');
546
+ module.exports = {
547
+ webpack: (config, applicationConfig) => {
548
+ config.resolve.alias = {
549
+ components: path.resolve(__dirname, 'src/components')
550
+ };
551
+ return config;
552
+ }
553
+ };
554
+ ```
555
+
556
+ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ `arui-scripts.overrides.ts`:
557
+ ```ts
558
+ import type { OverrideFile } from 'arui-scripts';
559
+ import path from 'path';
560
+
561
+ const overrides: OverrideFile = {
562
+ webpack: (config, applicationConfig) => {
563
+ config.resolve.alias = {
564
+ components: path.resolve(__dirname, 'src/components')
565
+ };
566
+ return config;
567
+ }
568
+ };
569
+
570
+ export default overrides;
571
+ ```
572
+
573
+ **Π’ случаС, Ссли Ρƒ вас Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π»Π΅ΠΆΠΈΡ‚ ΠΈ ts, ΠΈ js Ρ„Π°ΠΉΠ» с overrides, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄Π΅Ρ‚ js вСрсия.**
574
+
575
+ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠΎ всСм настройкам Π²Π΅Π±ΠΏΠ°ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ `alias` *components*.
576
+
577
+ На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:
578
+ - `babel-client` - конфигурация `babel` для клиСнтского ΠΊΠΎΠ΄Π°. ΠšΠ»ΡŽΡ‡ΠΈ: `babel`, `babelClient`.
579
+ - `babel-server` - конфигурация `babel` для сСрвСрноого ΠΊΠΎΠ΄Π°. ΠšΠ»ΡŽΡ‡ΠΈ: `babel`, `babelServer`.
580
+ - `dev-server` - конфигурация `webpack-dev-server`. ΠšΠ»ΡŽΡ‡ΠΈ: `devServer`.
581
+ - `postcss` - конфигурация для `postcss`. ΠšΠ»ΡŽΡ‡ΠΈ: `postcss`.
582
+ > `config` postcss содСрТит массив с ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΆΠ΅ зафиксированны. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
583
+ ```javascript
584
+ import {
585
+ createPostcssConfig, // функция для создания ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° postcss
586
+ postcssPlugins, // список плагинов
587
+ postcssPluginsOptions, // коллСкция ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
588
+ } from 'arui-scripts/build/configs/postcss.config';
589
+
590
+ module.exports = {
591
+ postcss: (config) => {
592
+ const { files } = postcssPluginsOptions['@csstools/postcss-global-data'];
593
+ const newOption = {
594
+ ...postcssPluginsOptions,
595
+ '@csstools/postcss-global-data': {
596
+ files:files.concat(['./vars.css'])
597
+ }
598
+ };
599
+ return createPostcssConfig(postcssPlugins, newOption);
600
+ },
601
+ };
602
+ ```
603
+ - `stats-options` - конфигурация для [webpack-stats](https://webpack.js.org/configuration/stats/). ΠšΠ»ΡŽΡ‡ΠΈ: `stats`.
604
+ - `webpack.client.dev` - конфигурация для клиСнтского webpack Π² dev Ρ€Π΅ΠΆΠΈΠΌΠ΅.
605
+ ΠšΠ»ΡŽΡ‡ΠΈ: `webpack`, `webpackClient`, `webpackDev`, `webpackClientDev`.
606
+ - `webpack.client.prod` - конфигурация для клиСнтского webpack Π² prod Ρ€Π΅ΠΆΠΈΠΌΠ΅.
607
+ ΠšΠ»ΡŽΡ‡ΠΈ: `webpack`, `webpackClient`, `webpackProd`, `webpackClientProd`.
608
+ - `webpack.server.dev` - конфигурация для сСрвСрного webpack Π² dev Ρ€Π΅ΠΆΠΈΠΌΠ΅.
609
+ ΠšΠ»ΡŽΡ‡ΠΈ: `webpack`, `webpackServer`, `webpackDev`, `webpackServerDev`.
610
+ - `webpack.server.prod` - конфигурация для сСрвСрного webpack Π² prod Ρ€Π΅ΠΆΠΈΠΌΠ΅.
611
+ ΠšΠ»ΡŽΡ‡ΠΈ: `webpack`, `webpackServer`, `webpackProd`, `webpackServerProd`.
612
+ - `supporting-browsers` - список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ [browserslist](https://github.com/browserslist/browserslist).
613
+ ΠšΠ»ΡŽΡ‡ΠΈ: `browsers`, `supportingBrowsers`
614
+ - `Dockerfile` - Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сборки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
615
+ Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон [Ρ‚ΡƒΡ‚](./src/templates/dockerfile.template.ts).
616
+ [`Dockerfile` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°](#docker) ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ overrides.
617
+ - `DockerfileCompiled` - Π΄ΠΎΠΊΠ΅Ρ€Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сборки ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΡ€ΠΈ использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `arui-scripts docker-build:compiled`
618
+ - `nginx` - шаблон ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для nginx Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
619
+ Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон [Ρ‚ΡƒΡ‚](./src/templates/nginx.conf.template.ts).
620
+ [Π€Π°ΠΉΠ» `nginx.conf`](#конфигурация-nginx) Π² ΠΊΠΎΡ€Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Π°ΠΌΠΈ.
621
+ - `start.sh` - шаблон entrypoint Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон [Ρ‚ΡƒΡ‚](./src/templates/start.template.ts).
622
+ - `serverExternalsExemptions` - список ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² список Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй сСрвСра. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅](#node-externals).
623
+
624
+ Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ нСсколько ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² этом Ρ„Π°ΠΉΠ»Π΅.
625
+
626
+ ### Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ для webpack
627
+ На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для webpack. НапримСр, для создания
628
+ service worker'Π° (ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… кСйсов). Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ…Π΅Π»ΠΏΠ΅Ρ€ `createSingleWebpackConfig`:
629
+
630
+ ```ts
631
+ import type { OverrideFile } from 'arui-scripts';
632
+
633
+ const overrides: OverrideFile = {
634
+ webpackClient: (config, appConfig, { createSingleClientWebpackConfig }) => {
635
+ return [
636
+ config,
637
+ createSingleClientWebpackConfig(
638
+ './src/sw.js', // entrypoint, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ массивом/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ
639
+ 'sw', // Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ сборки, влияСт Π½Π° ΠΈΠΌΠ΅Π½Π° Ρ‡Π°Π½ΠΊΠΎΠ²
640
+ ),
641
+ ];
642
+ }
643
+ };
644
+
645
+ export default overrides;
646
+ ```
647
+ Π­Ρ‚Π° функция Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для webpack, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Π°. Π’Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΅Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ,
648
+ Π½Π΅ боясь Ρ‡Ρ‚ΠΎ это повлияСт Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
649
+
650
+ Бозданная Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ конфигурация Π±ΡƒΠ΄Π΅Ρ‚ ΡˆΠ°Ρ€ΠΈΡ‚ΡŒ с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ для формирования assets-manifest'Π°.
651
+
652
+ ΠŸΡ€Π΅ΡΠ΅Ρ‚Ρ‹
653
+ ===
654
+
655
+ Π’ случаС, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄ΠΎΠ² сразу Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… - Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚
656
+ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прСсСтов. Он позволяСт Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Ρ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚.
657
+ Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пСрсСты Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² package.json:
658
+
659
+ ```json
660
+ {
661
+ "aruiScripts": {
662
+ "presets": "my-company-presets"
663
+ }
664
+ }
665
+ ```
666
+
667
+ Как прСсСт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ настройками (для поиска ΠΏΡƒΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ `require.resolve`
668
+ ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ, содСрТащСй package.json. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°ΠΏΠΊΠ° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Ρ‚Π°ΠΊ ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠ· node_modules).
669
+
670
+ Π‘Π°ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ с прСсСтами ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°:
671
+ - `arui-scirpts.config.js` (ΠΈΠ»ΠΈ `arui-scripts.config.ts`)
672
+ - `arui-scripts.overrides.js` (ΠΈΠ»ΠΈ `arui-scirpts.overrides.ts`)
673
+
674
+ ### arui-scripts.config (js | ts)
675
+ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ [ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ](#настройки).
676
+ ```js
677
+ module.exports = {
678
+ baseDockerImage: 'my-company-artifactory.com/arui-scripts-base:11.2'
679
+ };
680
+ ```
681
+
682
+ Или в видС ts:
683
+ ```ts
684
+ import type { PackageSettings } from 'arui-scripts';
685
+
686
+ const settings: PackageSettings = {
687
+ baseDockerImage: 'my-company-artifactory.com/arui-scripts-base:11.2'
688
+ };
689
+
690
+ export default settings;
691
+ ```
692
+
693
+ На ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ конфиурация Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС:
694
+ 1. Π±Π°Π·ΠΎΠ²Ρ‹Π΅ настройки ΠΈΠ· arui-scripts
695
+ 2. настройки ΠΈΠ· presets
696
+ 3. настройки ΠΈΠ· package.json ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°
697
+ 4. настройки, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· env ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ.
698
+
699
+ **Π’Π°ΠΆΠ½ΠΎ!**
700
+
701
+ Если Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `serverEntry`, `additionalBuildPath` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅)
702
+ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ корня ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π½Π΅ вашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.
703
+ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ ΠΏΡ€ΠΈ нСобходимости Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° с прСсСтами.
704
+
705
+ ### arui-scripts.overrides (js | ts)
706
+ Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ [заданию ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅](#тонкая-настройка).
707
+ ```js
708
+ module.exports = {
709
+ babelClient(config) {
710
+ config.plugins.push('my-awesome-babel-plugin');
711
+ return config;
712
+ }
713
+ };
714
+ ```
715
+
716
+ На ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Ρ‹ ΠΈΠ· прСсСтов Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, послС Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΠ²Π΅Ρ€Ρ€Π°ΠΉΠ΄Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.