如何使 TypeScript 输出有效的 ES6 模块导入语句?

2024-05-05

所有主流浏览器 http://caniuse.com/#feat=es6-module支持 ES6 模块已有一段时间了。

这些方法与许多服务器端方法的不同之处在于,它们需要指定要从中导入的确切文件 - 它们无法使用文件发现。

这是有道理的 - 在 Node 应用程序或像 WebPack 这样的捆绑器中,它们实际上只需要模块的名称,然后可以花费一些额外的时间来发现保存代码的特定文件。在网络上,可能会浪费大量的往返(是'library' in library/index.js, or library/library.js, or library.js? require()不在乎,但在网络上我们必须这样做)。

TypeScript 有 ES6 模块支持(设置"module": "es6" in tsconfig.json)但它似乎正在使用文件发现方法......

假设我有library.ts:

export function myFunction(...) {  ... }

Then in 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声明?

注:我是not询问如何使捆绑器将 TS 输出加入到单个文件中。我特别想使用单独加载这些文件<script type="module">


这是一个TypeScript 中的错误 https://github.com/Microsoft/TypeScript/issues/13422,尽管对于是否应该修复存在一些争议。

有一个解决方法:虽然 TS 不允许您指定.ts文件作为模块的源,它会让你指定一个.js扩展名(然后忽略它)。

So in app.ts:

import {myFunction} from './library.js';
var x = myFunction(...);

然后正确输出app.js,并且 TS 发现了import定义和绑定正确。

这有一个优点/陷阱需要注意/小心:TS 只是忽略.js扩展名并使用通常的文件发现加载路径的其余部分。这意味着它将导入library.ts,但它也会找到定义文件,例如library.d.ts或导入文件library/ folder.

如果您要将这些文件连接到一个文件中,那么最后一种情况可能是理想的library.js输出,但要做到这一点,您将查看大量嵌套tsconfig.json文件(混乱)或可能是另一个库的预转译输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 TypeScript 输出有效的 ES6 模块导入语句? 的相关文章

  • 删除 JSON 属性 [重复]

    这个问题在这里已经有答案了 如果我有一个 JSON 对象 请说 var myObj test key1 value key2 value 我可以删除 key1 使其变为 test key2 value Simple delete myObj
  • Node.js - 将数据缓冲到 Ffmpeg

    我使用 Node js 和 Ffmpeg 来创建动画 因为我试图避免第三方 avi mp4 解析器 所以我决定将动画输出为原始 rgb24 数据文件 然后使用一些程序将其转换为 mp4 文件 我发现 Ffmpeg 是免费且开源的 它完全可以
  • 在浏览器中下载视频,而不是在新选项卡中播放 [CORS]

    I have a 并在其内部href属性 当我点击该属性时 我从第 3 方 api 获得了一个视频 URL a 浏览器打开一个新选项卡并播放视频而不是下载视频 PROBLEM 我需要实现的是点击后直接下载视频 a 而不是在新标签中播放并强制
  • 我想使用 javascript 和按钮更改标签的 src 属性
  • 如何在没有 Node.JS 的情况下运行 UglifyJS2

    无论如何都要跑UglifyJS2 https github com mishoo UglifyJS2没有node js 假设我想使用 JavaScript 脚本引擎在 JVM 进程中运行它 怎么做 我看到米秀回答你了https github
  • blueimp jQuery-File-Upload - 如何提交不附加文件的表单?

    我找到了有关如何在提交文件上传表单时添加附加表单数据的解决方案 这个问题是如果没有要上传的文件 如何上传附加数据 我在任务管理应用程序中使用 blueimp jquery file upload 来拖放文件并将其附加到任务 该脚本已初始化并
  • React + Redux 和 REST API?

    我在 Node 中构建了一个简单的 CRUD 应用程序 并已在 Express 中完成了其余 API 的创建 我现在正在寻求添加前端功能 并希望使用 React Redux 作为学习练习 然而 似乎所有围绕此的教程都直接使用 Redux 访
  • 如何使 Javascript focus() 方法在输入文本框的 onBlur 事件中工作?

    对于我来说focus 如果我将它与按钮和 onClick 事件一起使用 则该方法工作正常 但使用onBlur从文本框中 它不起作用 有人可以指导我吗
  • 如何避免在 ASP.NET 代码隐藏中编写混乱的 JavaScript?

    我想知道在 ASP NET 中使用 Javascript 的最佳实践是什么 我不知道这是否是最佳实践 但我在代码隐藏中添加了 javascript 客户端事件 它工作正常 但这是最佳实践吗 例如 我有一个单选按钮控件 并在 Page Ini
  • 在tinymce 4中裁剪后上传图像

    我正在开发tinymce 并且已经实现了imagetools 现在 当图像插入到文本编辑器中 然后我编辑 裁剪图像时 它将图像 src 更改为类似的内容blob www localhost asdf ghij 我想要的是裁剪后我可以将此 u
  • 如何在生成的 HTML 页面中隐藏 JavaScript 注释? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有办法隐藏生成的页面源中的 JS
  • 在 MatDialog Content Angular 7 中添加新行

    我正在使用 MatDialog 并尝试在内容定义中添加新行 两个都 n and 没有这样做 有没有另一种方法无需手动进入 html 并更改它 因为它是可重用的组件 var status MatDialogRef
  • 如何在 Redux Toolkit 中订阅 React 组件之外的状态?

    我有以下切片 export const authenticationSlice createSlice name authentication initialState isFirstTimeLoading true signedInUse
  • 如何在 TypeScript 中声明私有抽象方法?

    如何在 TypeScript 中正确定义私有抽象方法 这是一个简单的代码 abstract class Fruit name string constructor name string this name name abstract pr
  • jquery中(“*”)有什么用

    我正在阅读 jQuery 我不知道为什么使用 请解释一下这有帮助 是jquery中的一个选择器 它可以无条件地选择所有内容 包括html head和body 这是一个解释其用法的示例 document ready function butt
  • 如果满足条件,Angular JS 如何添加 CSS 类

    我正在创建一个截断指令 如果字符超过 10 我就会截断文本字符串 然后它将显示 我的目标是编写一个条件 如果字符少于 10 个 则删除 如果有人对我如何实现此目标有任何想法 我会坚持这一点并接受建议 这是我的代码 var app angul
  • iOS 6 上的 Safari 是否缓存 $.ajax 结果?

    自从升级到 iOS 6 以来 我们看到 Safari 的网页视图擅自缓存 ajax来电 这是在 PhoneGap 应用程序的上下文中 因此它使用 Safari WebView 我们的 ajax电话是POST方法并且我们将缓存设置为 fals
  • 为什么 asmjs 代码即使在 Firefox 中也较慢?

    我创建了一个 jsPref 来测试这个 asm js 的东西 http jsperf com asm diag http jsperf com asm diag 我想我做错了什么 因为asmjs代码的运行速度比常规js代码慢两倍 即使在fi
  • 根据位置/日期更改日期选择器中的时间

    我在用着amsul 日期选择器和时间选择器 https amsul ca pickadate js time 我想根据选择的日期和复选框更改时间选择器的最小 最大小时 这是我的代码 var today new Date var tomorr
  • 如何强制重新安装 React 组件?

    假设我有一个具有条件渲染的视图组件 render if this state employed return div div

随机推荐