为什么在我的文件中添加“import”导致“require.config()”调用不再起作用?

时间:2017-03-29 03:03:33

标签: typescript requirejs

在我将设置应用于require.config的文件中,我还放置了其他设置,其中包括使用typescript的导出功能导入视图模型。我注意到它在所有浏览器中产生错误:

requireConfig.ts

import HomePage from "Custom/HomePage";

require.config
({
    baseUrl: "/Scripts/",    
    paths: {},
    shim: {}
});

require (["Custom/Initialisation/ConfigOnDocReady"]);

Uncaught TypeError: require.config is not a function at Object.<anonymous> (RequireConfig.ts:3)

当我删除第1行时,它可以正常工作。是什么造成的?我认为这是一个了解requireJs幕后背后的好机会。

1 个答案:

答案 0 :(得分:1)

摘要

RequireJS在本地和全球范围内提供require。您在本地提供的config上呼叫require。本地require没有config方法,您会收到错误消息。您应该在全局要求上调用config。 RequireJS将全局require的别名导出为requirejs,或者您可以window.require的形式访问该地址。

长解释

RequireJS的本地和全球require来电

RequireJS提供了require的两个访问点:全局访问和本地访问。在浏览器中,全局空间导出到全局空间window。如果您在调用require时特别请求它作为依赖关系列表中的模块,则会提供本地define。调用define是使用AMD加载器注册AMD模块的标准方法(这就是RequireJS所针对的)。这里回调的参数是本地require

define(['require'], function (require) {
});

(如果您完全省略了依赖项列表,它也会自动提供给回调,但此方案不需要在此处扣留我们。)

本地require未提供config方法。如果这样做是没有意义的,因为调用config具有全局效应。例如,没有规定仅为上下文中的某些模块而不是其他模块更改baseUrl。因此,RequireJS仅在全局config上提供require方法。

&#34;但是等等#34;,你说,&#34;我没有在任何地方拨打define!&#34;

不,但是TypeScript会发出调用define的代码。

TypeScript如何发出代码

删除import时,您的代码有效,因为TypeScript根据是否存在显着不同的代码:

  1. 如果您拥有import语句,那么您的代码将包含在与上面显示的define相似的类似的内容中,因此,您拨打require的电话是对本地的电话。 (define生成的tsc包装器更复杂,但这里并不重要。)

  2. 如果没有import/export个语句,则代码被视为&#34;脚本&#34;和TypeScript不会输出任何与模块相关的代码。特别是,我发布的代码没有上面显示的define包装,而您对require的调用是对全球的调用之一。

  3. The Upshot

    如果要从模块内部更改配置,则应该注意调用全局require。 RequireJS也在requirejs别名下导出它。所以你可以致电requirejs.config。或者,您可以window window.require明确地访问它。