В первую очередь это зависит от флага --moduleResolution
(compilerOptions.moduleResultion
в tsconfig.json).
Автоматическое преобразование каталога в файл с именем index
в этом каталоге является соглашением NodeJS. Это соглашение распространилось на разработку на стороне клиента, но, тем не менее, остается соглашением. Он не является частью спецификации модуля ECMAScript или спецификации AMD.
При указании --moduleResolution node
TypeScript будет следовать этому соглашению.
Кроме того, когда для флага --module
(compilerOptions.module
в tsconfig.json) установлено значение commonjs
, это соглашение применяется автоматически даже при отсутствии флага --moduleResolution
.
Обратите внимание, что этот параметр применяется как к коду приложения, так и к зависимостям в таких каталогах, как node_modules
, jspm_packages
и bower_components
.
Хотя это наиболее целесообразно для проектов CommonJS, установка --moduleResolution node
может быть выгодна в других форматах модулей, поскольку она помогает в разрешении зависимостей, а также позволяет избежать некоторых ловушек, связанных с альтернативным режимом разрешения classic
.
Однако имейте в виду, что загрузчики, такие как RequireJS и SystemJS, не будут автоматически использовать это соглашение в исходном коде вашего приложения, поэтому при импорте собственного кода приложения по-прежнему рекомендуется использовать явные индексные файлы в спецификаторах модулей.
Несмотря на склонность CommonJS к настройкам --moduleResolution node
, я по-прежнему предпочитаю и рекомендую, хотя я не использую CommonJS, Webpack или Browserify в браузере (когда я могу их избежать).
Мой любимый загрузчик — SystemJS, а менеджер пакетов — JSPM, но я все же предпочитаю использовать схему разрешения узлов, потому что она упрощает импорт зависимостей, отчасти благодаря автоматической настройке JSPM загрузчика SystemJS.
Теперь давайте перейдем к --baseUrl
применительно к вашему сценарию.
Вы пытаетесь импортировать локальный модуль как
import * as modulename from "modulename";
и установили --module commonjs
и --baseUrl /
в попытке импортировать локальный модуль, как если бы это был сторонний пакет, чтобы подготовить вашу кодовую базу к ее разделению на отдельный пакет. Могу добавить, что это хорошее планирование, так что +10 за это!
Однако, если вы планируете использовать модули CommonJS (чего я снова не советую делать только для браузерных приложений), вам определенно следует установить для "baseUrl"
значение "."
, а не "/"
. Даже в этом случае такие инструменты, как Native NodeJS require function, не поддерживают концепции baseUrl, возникшие в мире инструментов браузера. Однако Webpack поддерживает его.
В любом случае, чтобы загружать модули, которые являются частью вашего собственного исходного кода, используя спецификатор модуля, который не является относительным или абсолютным URL-адресом, я рекомендую следующее независимо (помните о требованиях к загрузчику!):
- Установите
"baseURl"
на "."
- Установите
"moduleResolution"
на "node"
,
- Установите
"module"
явно на "commonjs"
, "system"
или "amd"
(я не советую "umd"
).
- Если вы не используете
"commonjs"
под узлом, рассмотрите возможность использования "paths"
, так как это позволяет выполнить очень сложную реструктуризацию.
person
Aluan Haddad
schedule
17.05.2017
import * as m from "./modulename"
. - person Aaron Beall   schedule 17.05.2017--paths
также очень полезна с загрузчиком AMD или System.register. ГЛ ХФ! - person Aluan Haddad   schedule 17.05.2017