【发布时间】:2018-02-06 12:31:30
【问题描述】:
All major browsers 支持 ES6 模块已有一段时间了。
这些与许多服务器端方法的不同之处在于它们需要指定要从中导入的确切文件 - 它们不能使用文件发现。
这是有道理的——在 Node 应用程序或像 WebPack 这样的打包工具中,它们只需要模块的名称,然后可以花费一些额外的时间来发现包含代码的特定文件。在网络上可能会浪费很多往返行程('library' 在library/index.js,或library/library.js,或library.js?require() 不在乎,但在网络上我们必须这样做)。
TypeScript 支持 ES6 模块(在 tsconfig.json 中设置 "module": "es6"),但它似乎使用了文件发现方法...
假设我有library.ts:
export function myFunction(...) { ... }
然后在app.ts:
import {myFunction} from './library';
var x = myFunction(...);
但是,在转译时这并没有改变 - TS 输出仍然具有用于文件发现的 'library' 名称,这不起作用。这会引发错误,因为找不到 'library':
<script type="module" src="app.js"></script>
为了让 ES6 模块工作,TS 输出需要引用特定文件:
import {myFunction} from './library.js';
var x = myFunction(...);
如何让 TS 输出有效的 ES6 模块 import 语句?
注意:我不是询问如何让捆绑器将 TS 输出连接到单个文件中。我特别想使用<script type="module">单独加载这些文件
【问题讨论】:
-
...from 'library';和...from './library.js';是两个不同的东西,第一个是命名包,第二个是模块的相对路径 -
@MaximKoretskyi 是的 - 命名包有一个入口点,它需要是模块导入的显式相对或绝对路径。网络不能使用包名。
-
如果使用命名包导入,TS无法输出相对路径,因为库与导入模块不在同一目录中,对吧?
-
@MaximKoretskyi 没关系,无论哪种方式,路径都不起作用。
./library失败,../src/utils/library失败,https://example.com/cdn/library失败。 -
什么时候失败?在浏览器中?
标签: javascript typescript es6-modules