javascript - 没有模块加载器的网络打字稿?
问题描述
目前这对我来说是一个非常令人困惑的话题,我也相信很多其他人。互联网上流传的许多建议似乎非常具有误导性。
我想做什么?
我正在尝试使用纯 TypeScript 和 HTML 构建一个基本网页。我想将编译后的 JavaScript 包含在标准<script>
标记中,例如
<script src="javascriptOutput/myCompiledJsFile.js></script>
同时仍然能够使用 TypeScript 的正常模块功能,这意味着将我的代码拆分为不同的文件并将它们导入到myCompiledJsFile.js
我包含在我的 HTML 中的主脚本中。
有什么问题?
有了以下内容tsconfig.json
,
{
"compilerOptions": {
"target": "es5",
"module": "commonjs"
// ...
}
}
JavaScript 控制台总是抛出这个错误:Uncaught ReferenceError: exports is not defined
.
根据我的阅读,问题似乎在于模块系统被指定为commonjs
,如果没有外部模块加载器(如 SystemJS,Webpack 中包含的模块等),它似乎无法工作。
如果我是对的,我认为应该可以在没有这些外部模块加载器之一的情况下使用 TypeScript。但我不知道如何配置 TypeScript 以使浏览器可以在没有Uncaught ReferenceError
. 而且我也不知道在哪里可以找到有关哪些浏览器支持哪些模块加载器/模块系统的信息。我是否必须查看浏览器运行的 JavaScript 引擎(例如 Chrome 的 V8)?
我也不想使用任何“黑客”,例如var scripts = {}
在编译的 JS 中添加或删除行。
解决方案
如果有人想知道:我的问题的解决方案是使用原生 ES 模块系统。这意味着根据浏览器支持的内容选择ES2015
或ES2020
中的module
键。tsconfig.json
由于我希望仅在 Chrome (Electron) 中运行我的代码,并且 Chrome 从今天开始完全支持 ES2020,因此我选择ES2020
用于我的模块系统。
如果您选择使用这些模块,AFAIK,您需要将type="module"
属性添加到您的脚本标签:
<script src="../myJsFolder/myJs.js" type="module"></script>
推荐阅读
- javascript - 如何在打字稿中访问组件
- python - 意外的类型:(int, int) 可能的类型:(SupportsIndex, None) (slice, Iterable[None])
- json - SchemaCrawler CLI 命令以 JSON 格式序列化 PostgreSQL 数据库,仅在 Schema 上显示 UID 而不是 SCHEMA 名称和信息
- bash - 对带有 getopt 的选项使用两个参数值
- c# - 如何创建一个非活动的异步方法存根?
- css - PhpStorm 中的 CSS 属性名称自动完成
- ruby-on-rails - 在rails中绘制图形
- c# - 使用 .NET 在 Angular 和 Cosmos DB 之间传递“纯”(无类)json
- windows - 在 non_ssl Apache Windows 安装上激活 mod_ssl 时出错“操作系统无法运行 %1”
- netsuite - 如何将 HTML 放入子列表字段?