Модули Grunt и ES6 в узле - несовместимы без использования .m js? - PullRequest
0 голосов
/ 17 июня 2020

Итак, я немного балуюсь Typescript и Grunt, чтобы посмотреть, стоит ли оно того для меня. Дело в том, что Typescript не компилируется в файлы *.mjs, а только в обычные файлы *.js. Node поддерживает модули ES6, но только в том случае, если вы либо помечаете их как файлы '* .jsm', либо устанавливаете "type": "module". Однако установка этого поля верхнего уровня в package.json имеет глобальную область действия для любого файла *.js в том же каталоге и любых последующих.

Это приводит к поломке файла Gruntfile.js, как кажется, поскольку он использует Common JS модулей, см. Мой самый базовый c Gruntfile в качестве примера:

module.exports = function (grunt) {
   grunt.initConfig({
      ts: {
         default: {tsconfig: "./tsconfig.json"}
      }
   })
   grunt.loadNpmTasks("grunt-ts");
   grunt.registerTask("default", ["ts"]);
}

Не ожидая особого успеха, я наивно изменил синтаксис экспорта с module.exports = на export default, который, как и ожидалось, не сработал, поскольку он не работал В этом нет особого смысла.

Вопросы

  1. Есть ли возможность использовать Grunt с модулями ES6, включенными в узле?
  2. Есть ли подходящий способ сообщить TypeScript компилировать в *.mjs файлы?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Предлагаемый подход с запуском Babel до Grunt делает Grunt немного избыточным. Поскольку TypeScript еще не поддерживает экспорт модулей ES6 в файлы *.mjs (и вы должны использовать суффикс *.mjs в своем импорте, когда узел все еще должен работать с его системой Common JS) и, вероятно, никогда не будет полностью (см. Design Meeting Notes 22.11.2019 ) Я должен сделать вывод, что модули ES6 все еще имеют серьезные последствия и проблемы. Изменение расширения файла недостаточно , поскольку импорт без расширения завершается неудачно с node. Вам потребуется go через каждый скомпилированный файл и изменить импорт, чтобы специально загружать *.mjs файлы.

Однако компилятор TypeScript может быть настроен таким образом, чтобы понимает синтаксис модуля ES6 и компилируется в Common JS (см. TS handbook ).

{
  "compilerOptions": {
    "module": "CommonJS",
    // [...]
  },
}

Таким образом, код TypeScript будет написан с синтаксисом модуля ES6, и выходные данные могут быть совместимы с Common JS без нарушения другого кода. В качестве бонуса вы можете пропустить подход Babel, а grunt может запустить компилятор TS.

0 голосов
/ 17 июня 2020

Вы можете использовать babel-node для первой компиляции. Это решит проблему экспорта и импорта ES6.

npm install --save-dev @babel/core @babel/node
npx babel-node server.js
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...