Не относительный импорт Typescript с модулями node js и ES не работает - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь создать простой скрипт Typescript, который использует модули ES, выполнить его с узлом и иметь исходные карты для отладки.

Сценарий, выполненный с узлом test.ts :

import foo from './foo'

//import bar from './../src/util/bar' //works
//import bar from 'src/util/bar' // does not work. Linter nor tsc show any warning, but when trying to execute, error says bar can't be found
import bar from '@util/bar' // same as above

console.log('test 0')
console.log(foo + bar)

export {}

foo.ts :

export default "foo_module"

bar.ts очень похож.

Здесь tsconfig. json:

{
  "compilerOptions": {
    "target": "es5",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "ESNext",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "allowJs": true,                       /* Allow javascript files to be compiled. */
    "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
    "sourceMap": true,                     /* Generates corresponding '.map' file. */
    "outDir": "lib",                          /* Redirect output structure to the directory. */
    "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
    "baseUrl": ".",                       /* Base directory to resolve non-absolute module names. */
    "paths": {
      "*":[ "./../*" ],
      "@util/*":[ "./../src/util/*" ],
    },                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    "allowSyntheticDefaultImports": true,     /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true                  /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
  },
}

Когда все операции импорта являются относительными, все работает нормально.

Когда bar.ts импортируется с использованием не относительных import (src/util/bar), ts c и linter не жалуются, но при попытке выполнить его с узлом появляется следующая ошибка:

internal/modules/esm/default_resolve.js:100
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find package '@util/bar' imported from <...omitted>\scripts\lib\scripts\test.js
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:100:13)
    at Loader.resolve (internal/modules/esm/loader.js:72:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
    at link (internal/modules/esm/module_job.js:41:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

Минимальный пример для воспроизведения - здесь

...