рекомендуемая конфигурация скриптов для узла 8
Каков рекомендуемый конфиг для машинописного текста, если я хочу использовать скомпилированные источники с узлом 8?
В большинстве руководств используется следующий tsconig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs"
}
}
Но теперь я понял, что не все доступные функции поддерживаются. Например, ['foo'].includes('bar')
выдает ошибку: свойство 'includes' не существует в типе 'string []'.
Я нашел проблему, которая решает эту проблему. Решение заключается в использовании lib es7
. Я мог бы перезаписать libs по умолчанию: "lib": ["es7"]
Но я не уверен, что это лучший вариант для узла 8 - есть ли еще функции, которые не поддерживаются этой библиотекой? есть ли определенные функции?
Поэтому мой вопрос: каковы наилучшие конфигурации для target
, lib
и module
если я хочу использовать узел 8?
Ответы
Ответ 1
Начиная с Node.js 8.10.0
100% ES2017. Если вы знаете, что используете таргетинг на эту версию или новее, оптимальная конфигурация будет выглядеть так:
-
"module": "commonjs"
Node.js по-своему добавляет ES-модули, но пока нам придется придерживаться CommonJS.
-
"target": "es2017"
Это говорит TypeScript, что это нормально выводить синтаксис JavaScript с функциями из ES2017. На практике это означает, что он будет, например, выход async
/await
вместо встраивания polyfill (__awaiter
).
-
"lib": ["es2017"]
Это говорит TypeScript, что можно использовать функции и свойства, введенные в ES2017 или ранее. На практике это означает, что вы можете использовать, например, Array.prototype.includes
и String.prototype.padStart
.
Таким образом, полная конфигурация будет:
{
"compilerOptions": {
"lib": ["es2017"],
"module": "commonjs",
"target": "es2017"
}
}
Ответ 2
Я уверен, что вы уже нашли это, но здесь есть шаблон стартера Microsoft: https://github.com/Microsoft/TypeScript-Node-Starter
Пока вы все еще находитесь на узле 8.x, держите свой module
в commonjs
, target
может быть es6
.
compilerOptions.lib
только определяет, какие объявления компилятор использует для проверки времени компиляции, это не влияет на вывод tsc
. Другими словами, вы можете использовать любую lib
которую хотите, и не беспокоиться о том, что ваш transpiled-код будет другим (это полностью контролируется compilerOptions.target
).
Использование es7
как lib
в вашем случае будет в порядке и даст вам объявления типа для ES7 и ниже.
Array.includes
- ES7 (ES2016), и поэтому, как вы обнаружили, это не часть ES6
. Вы можете определить свой lib
как; lib: ["es6", "ES2016.Array.Include"]
чтобы обойти вашу проблему.