为什么向我的文件添加 "import" 会导致 "require.config()" 调用不再有效?
Why does adding an "import" to my file cause the "require.config()" call to no longer work?
在我将设置应用到 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 幕后内容的好机会。
总结
RequireJS 在本地和全局提供 require
。您正在通过本地提供的 require
呼叫 config
。本地 require
没有 config
方法,你会得到你得到的错误。您应该在全局要求上调用 config
。 RequireJS 将别名导出到全局 require
作为 requirejs
,或者您可以作为 window.require
.
访问它
长篇解释
RequireJS 的本地和全局 require
调用
RequireJS 提供了两个访问 require
的点:一个是全局的,一个是本地的。在浏览器中,全局的导出到全局的space,window
。如果您在调用 define
时明确将其作为依赖列表中的模块请求,则会提供本地 require
。调用 define
是用 AMD 加载程序(这就是 RequireJS 是什么)注册 AMD 模块的标准方法。这里回调的参数是本地 require
:
define(['require'], function (require) {
});
(如果你完全省略依赖列表,它也会自动提供给回调,但这种情况不必在这里耽搁我们。)
本地require
没有提供config
方法。如果它这样做就没有多大意义,因为调用 config
具有全局效果。例如,没有规定只为上下文中的某些模块更改 baseUrl
而不是其他模块。所以 RequireJS 只在全局 require
.
上提供了一个 config
方法
“但是等等”,你说,“我不会在任何地方打电话给 define
!”
否,但 TypeScript 正在发出调用 define
.
的代码
TypeScript 如何发出您的代码
当您删除 import
时,您的代码可以正常工作,因为 TypeScript 会根据它是否存在输出截然不同的代码:
当你有 import
语句时,你的代码被包裹在与我展示的 define
相似 的东西中上面,因此,您对 require
的调用是对 local 的调用。 (由 tsc
生成的 define
包装器更复杂,但这在这里并不重要。)
如果没有import/export
语句,代码被认为是“脚本”,TypeScript不会输出任何与模块相关的代码。特别是,发出的代码不会有我上面显示的 define
包装器,并且您对 require
的调用是对 global 的调用.
结果
如果你想从模块内部更改配置,你应该注意调用全局 require
。 RequireJS 也以 requirejs
别名导出它。所以你可以调用requirejs.config
。或者您可以通过 window
作为 window.require
.
显式访问它
在我将设置应用到 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 幕后内容的好机会。
总结
RequireJS 在本地和全局提供 require
。您正在通过本地提供的 require
呼叫 config
。本地 require
没有 config
方法,你会得到你得到的错误。您应该在全局要求上调用 config
。 RequireJS 将别名导出到全局 require
作为 requirejs
,或者您可以作为 window.require
.
长篇解释
RequireJS 的本地和全局 require
调用
RequireJS 提供了两个访问 require
的点:一个是全局的,一个是本地的。在浏览器中,全局的导出到全局的space,window
。如果您在调用 define
时明确将其作为依赖列表中的模块请求,则会提供本地 require
。调用 define
是用 AMD 加载程序(这就是 RequireJS 是什么)注册 AMD 模块的标准方法。这里回调的参数是本地 require
:
define(['require'], function (require) {
});
(如果你完全省略依赖列表,它也会自动提供给回调,但这种情况不必在这里耽搁我们。)
本地require
没有提供config
方法。如果它这样做就没有多大意义,因为调用 config
具有全局效果。例如,没有规定只为上下文中的某些模块更改 baseUrl
而不是其他模块。所以 RequireJS 只在全局 require
.
config
方法
“但是等等”,你说,“我不会在任何地方打电话给 define
!”
否,但 TypeScript 正在发出调用 define
.
TypeScript 如何发出您的代码
当您删除 import
时,您的代码可以正常工作,因为 TypeScript 会根据它是否存在输出截然不同的代码:
当你有
import
语句时,你的代码被包裹在与我展示的define
相似 的东西中上面,因此,您对require
的调用是对 local 的调用。 (由tsc
生成的define
包装器更复杂,但这在这里并不重要。)如果没有
import/export
语句,代码被认为是“脚本”,TypeScript不会输出任何与模块相关的代码。特别是,发出的代码不会有我上面显示的define
包装器,并且您对require
的调用是对 global 的调用.
结果
如果你想从模块内部更改配置,你应该注意调用全局 require
。 RequireJS 也以 requirejs
别名导出它。所以你可以调用requirejs.config
。或者您可以通过 window
作为 window.require
.