15

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

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

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

4

3 回答 3

7

The only reason you would choose to use RequireJS for running your TypeScript program in a browser would be if you had hundreds of modules, but the page may only need two or three to perform its actions. We are talking serious big programs here, not lightweight apps or additional funky stuff for a web page.

Using RequireJS for a really big application means you only load the scripts you really need - not everything just in case.

For the sake of an example, imagine you wrote Microsoft Office as a TypeScript program, you could use RequireJS to load just the stuff you need as you need it. 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. This might mean you've downloaded only 10% of the program in several small chunks.

Module Loaders

TypeScript doesn't have its own module loader. It compiles TypeScript into JavaScript converting your module import statements into either CommonJS or AMD style code. Asynchronous Module Definition (AMD) is the module format used by RequireJS. CommonJS modules are used by NodeJS. You need to lean on these module loaders whether you are using TypeScript or JavaScript.

TypeScript simply transforms this:

import myModule = module('mymodule');

Into either require or define statements as per section 10.4 of the TypeScript Language Specification.

于 2013-06-17T11:00:15.390 回答
2

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

于 2013-06-17T09:44:23.790 回答
1

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

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

于 2013-06-16T19:53:48.553 回答