Как настроить реагирующий скрипт, чтобы он не перекрывал tsconfig.json при запуске
Я сейчас пользуюсь create-react-app
загрузить один из моих проектов. По сути, я пытаюсь настроить пути в tsconfig.json, добавив их в tsconfig.json по умолчанию, сгенерированный create-реагировать-приложение:
"baseUrl": "./src",
"paths": {
"interfaces/*": [
"common/interfaces/*",
],
"components/*": [
"common/components/*",
],
},
Тем не менее, каждый раз, когда я бегу yarn start
который в основном работает react-scripts start
, он удаляет мои изменения и снова генерирует конфигурации по умолчанию.
Как я могу сказать, что create-реакции-приложение использует мои пользовательские настройки?
9 ответов
Я смог сделать это, воспользовавшись советом по этому вопросу.
Поместите параметры конфигурации, реагирующие на удаление сценариев, которые любит удалять, в отдельный файл (например, paths.json) и ссылайтесь на него из tsconfig.json через директиву extends.
paths.json:
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"interfaces/*": [ "common/interfaces/*"],
"components/*": [ "common/components/*"],
}
}
}
tsconfig.json
{
"extends": "./paths.json"
...rest of tsconfig.json
}
Создать приложение React в настоящее время не поддерживает baseUrl
, Однако есть обходной путь... для настройки baseUrl
для обоих веб-пакетов и IDE вы должны сделать следующее:
- Создать
.env
файл со следующим кодом:
NODE_PATH=./
- Создать
tsconfig.paths.json
файл со следующим кодом внутри:
{
"compilerOptions": {
"baseUrl": "src",
"paths": {
"src/*": ["*"]
}
}
}
- Добавьте следующую строку в
tsconfig.json
{
"extends": "./tsconfig.paths.json",
...
}
Вы не можете, и я не уверен, когда вы сможете. Я пытался использовать baseUrl и пути, чтобы избежать относительного импорта, но, как вы можете видеть, они намеренно удаляют определенные значения. "(Пока)" обнадеживает, но (вздыхает) кто знает, когда они официально поддержат его. Я рекомендую подписаться на эту проблему github, чтобы получать уведомления, если / когда это изменится.
The following changes are being made to your tsconfig.json file:
- compilerOptions.baseUrl must not be set (absolute imports are not supported (yet))
- compilerOptions.paths must not be set (aliased imports are not supported)
Если вы, как и я, используете сценарии реакции 4.0.0, все, что вам нужно сделать, это удалить строку (около строки 160 с моей стороны):
paths: { value: undefined, reason: 'aliased imports are not supported' }
из файла
node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js
Мне удалось прямо добавить мою конфигурацию baseUrl и paths в свой
tsconfig.json
файл так:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@domain/*": ["../src/domain/*"],
},
}
}
и, наконец, компилируем и продолжаем жить своей жизнью.
Как обычно, YMMV. Пожалуйста, проверьте свой материал. Это, очевидно, взлом, но у меня это сработало, поэтому я публикую здесь, если это кому-то поможет.
Вот патч, если вы хотите поделиться со своей командой:
diff --git a/node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js b/node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js
index 00139ee..5ccf099 100644
--- a/node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js
+++ b/node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js
@@ -156,7 +156,8 @@ function verifyTypeScriptSetup() {
: 'react',
reason: 'to support the new JSX transform in React 17',
},
- paths: { value: undefined, reason: 'aliased imports are not supported' },
+ // Removed this line so I can add paths to my tsconfig file
+ // paths: { value: undefined, reason: 'aliased imports are not supported' },
};
У меня была проблема, аналогичная этой общей проблеме (CRA перезаписывает "noEmit": false
в моем tsconfig.json
библиотеки React, над которой я работаю, где у меня есть две отдельные сборки: одна для локальной разработки, а другая для сборки производственной библиотеки с типизацией). Простое решение: использоватьsed
в postbuild
сценарий в package.json
. Например: на месте редактирования с SED на OS X.
{
...
"scripts": {
...
"postbuild": "sed -i '' 's/{THING CRA IS REPLACING}/{WHAT YOU ACTUALLY WANT}/g' tsconfig.json # CRA is too opinionated on this one.",
...
}
...
}
Однако этот подход не является кроссплатформенным (в отличие от того, как rimraf
кроссплатформенная альтернатива rm -rf
).
Для меня проблема заключалась в том, что VSCode использовал более старую версию машинописного текста (4.0.3), в то время как версия машинописного текста, поставляемая с проектом, - (4.1.2).
Следующее помогло мне:
- Перейдите в палитру команд CTRL+Shift+P.
- Выберите «TypeScript: выберите версию TypeScript ...».
- Выберите «Использовать версию рабочей области».
В Botpress (со сценариями реагирования 4.0.3) мы используем комбинацию из двух приемов, чтобы использовать пути без извлечения или исправления кода. Как сказали Гленн и Microcipcip, первый шаг — расширить файл tsconfig.json.
tsconfig.path.json
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"~/*": ["src/*"],
"common/*": ["../bp/src/common/*"]
}
}
}
tsconfig.json
{
...
"extends": "./tsconfig.paths.json"
}
Затем, чтобы заставить его работать в фоновом режиме, используйте пакет
react-app-rewired
. Это позволяет вносить небольшие изменения в конфигурацию веб-пакета, фактически не отключая CRA.
config-overrides.js
module.exports = {
webpack: (config, env) => {
config.resolve.alias['common'] = path.join(__dirname, '../bp/dist/common')
config.resolve.alias['~'] = path.join(__dirname, './src')
}
}
Чтобы увидеть полный код, вы можете проверить репозиторий github https://github.com/botpress/botpress/tree/master/packages/ui-admin .
Для macOS этот обходной путь должен работать.
package.json
"scripts": {
"start": "osascript -e 'tell app \"Terminal\" to do script \"cd $PATH_TO_REACT_APP && node ./setNoEmitFalse\"' && react-scripts start",
...
},
...
setNoEmitFalse.js
const fs = require('fs');
const { sleep } = require('sleep')
const path = './tsconfig.json'
const run = async () => {
sleep(2)
const tsconfig = fs.readFileSync(path, 'utf-8');
const fixed = tsconfig.replace('"noEmit": true', '"noEmit": false');
fs.writeFileSync(path, fixed)
}
run()
Выполнение файла javascript в отдельном терминале (osascript) обеспечивает нормальный вывод для сценариев реакции в исходном терминале.
Перейдите в node_modules/react-scripts/scripts/utils/verifyTypeScriptSetup.js и замените
const compilerOptions = {
...
};
по
const compilerOptions = { };