arui-scripts 15.6.0 → 15.6.1

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