【问题标题】:Typescript why and when requirejs is needed打字稿为什么以及何时需要requirejs
【发布时间】:2014-11-08 02:15:56
【问题描述】:

这是一个关于 Typescript 为什么以及何时需要 requirejs 的更普遍的问题。 我之前用 requireJs 做过一些工作,并且在部署之前总是使用 r.js 构建脚本。 据我了解,合并所有 js 文件(模块)的构建脚本是为了降低 http 请求的数量,当然还提供了一种模块化代码的方法。

我的问题是这样的:既然打字稿已经提供了一种将代码分成模块的简单方法,为什么不直接合并 生成的 js 文件,而不是使用 requirejs 处理模块的额外步骤? 如果处理较大的项目,我知道不应该一次加载所有 js,但我认为仍然会以某种方式捆绑模块。

编辑:更具体地说: 为什么要使用 requireJs 来管理我的模块,而不仅仅是坚持使用 typescript internals 模块,据我所知,这些模块也可以在运行时加载。基于 amd 和 requirejs 的内部模块与外部模块。

【问题讨论】:

  • 你为什么假设两者都需要?比如,谁告诉你两者都用?好像在乞求这个问题,如果有的话。如果你使用 requirejs 只是为了制作一个缩小的 uberjs,那么显然它是多余的。

标签: visual-studio-2012 requirejs typescript


【解决方案1】:

您选择使用 RequireJS 在浏览器中运行 TypeScript 程序的唯一原因是如果您有数百个模块,但页面可能只需要两三个即可执行其操作。我们在这里谈论的是严肃的大型程序,而不是轻量级的应用程序或网页的其他时髦东西。

将 RequireJS 用于非常大的应用程序意味着您只加载您真正需要的脚本 - 并非所有内容以防万一。

举个例子,假设您将 Microsoft Office 编写为 TypeScript 程序,您可以使用 RequireJS 来加载您需要的内容。 So at first, you'd load what you need for exploring files, then when a file was selected it would cause that module (maybe Word) to load, with its dependencies.这可能意味着您只下载了几个小块的程序的 10%。

模块加载器

TypeScript 没有自己的模块加载器。它将 TypeScript 编译为 JavaScript,将您的模块导入语句转换为 CommonJS 或 AMD 样式代码。异步模块定义 (AMD) 是 RequireJS 使用的模块格式。 NodeJS 使用 CommonJS 模块。无论您使用的是 TypeScript 还是 JavaScript,都需要依赖这些模块加载器。

TypeScript 只是对此进行了转换:

import myModule = module('mymodule');

根据TypeScript Language Specification 的第 10.4 节进入requiredefine 语句。

【讨论】:

  • 感谢您的回答 - 谢谢。我确实知道 requireJs 正在帮助我们解决问题,这就是人们会在普通 js 中使用像 requireJs 这样的模块加载器的原因。但我认为你没有回答我的问题,为什么要使用 requireJs 来管理我的模块,而不仅仅是坚持使用 typescript 内部模块,据我所知,它也可以在运行时加载。
  • @ddennis 我已经添加了关于此的注释。本质上,TypeScript 没有内置的模块加载器,但它同时支持 CommonJS 和 AMD 模块加载器。
  • @Sohnee requirejs 如何与具有多个菜单的应用程序一起工作,每个菜单都有自己的 ts 文件和依赖项,单击菜单应该只加载所需的文件。有什么可以借鉴的资源吗。您在回答中提到的相同示例。我已经阅读了有关 requirejs 的内容,但这些示例只是用于演示的小型应用程序。
【解决方案2】:

如果在页面加载期间只加载一个 JS 文件,则不需要 requireJS。
如果您有多个 js 文件,并且不希望将它们加载到 index.html 中,而是在脚本运行时加载,则确实需要 requireJS。这些将被异步加载,并且只加载一次。需要脚本后的代码只有在加载了需要的脚本后才会执行。 当您不确定用户是否需要某个模块时,这对于延迟加载特别有用。
另一个好处是在每个模块中定义了模块依赖关系,因为每个需要其他模块才能工作的模块可以包含适当的“require”-Statements。

【讨论】:

  • 谢谢-我的问题不是关于requireJS,它已经使用并理解了。我已经编辑了问题并试图更具体。
【解决方案3】:

对于您描述的用例,您不需要 requireJS,因为您不需要手动合并生成的 js 文件。 typescript 编译器可以为你做到这一点。您可以为tsc 命令指定--out file.js 选项。这将编译所有 .ts 文件并生成单个 JavaScript 输出文件。这允许您使用 Typescript module 关键字将代码拆分为单独的 .ts 文件中的模块,并将它们合并以优化部署。

您可以更改从 TypeScript 导出到 AMD 的模块格式。需要 RequireJS 来加载这些模块。还有一些 RequireJS 插件,它们除了加载模块之外还可以做一些额外的事情,例如异步加载文本文件

【讨论】:

  • 谢谢 - 我知道编译器使用的 --out 参数。这是使用 flashdevelop 的默认设置,它也支持 typescript。但是大多数教程,包括复数形式bit.ly/10ovDqb 从来没有解释过为什么需要 requireJS。因此,任何关于何时需要 requirejs 的示例或用例基本上都是我正在寻找的。 - 再次感谢
  • 您可以更改从 TypeScript 导出到 AMD 的模块格式。需要 RequireJS 来加载这些模块。还有一些 RequireJS 插件,它们除了加载模块之外还可以做一些额外的事情,例如异步加载文本文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2013-12-15
  • 1970-01-01
  • 2017-07-14
  • 2013-03-06
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多