所以,我有一个使用 requireJS 的应用程序。挺开心的。在大多数情况下。
这个应用程序使用了 Socket.IO。Socket.IO 由 nodejs 提供,并且不在与主网络服务器相同的端口上运行。
为了解决这个问题,在我们的主 js 文件中,我们执行以下操作:
var hostname = window.location.hostname;
var socketIoPath = "http://" + hostname + ":3000/socket.io/socket.io";
requirejs.config({
baseUrl: "/",
paths: {
app : "scripts/appapp",
"socket.io" : socketIoPath
}
});
比这更复杂,但你明白了要点。
现在,在交互模式下,这可以游泳。
当我们尝试使用 r.js 编译它时,丑陋就开始了(技术上我们使用 grunt 来运行 r.js,但这不是重点)。
在 r.js 的配置中,我们为 socket.io 设置了一个空路径(以避免它无法拉入),并将我们的主文件设置为 mainConfigFile。
编译器对此大喊大叫,说:
Running "requirejs:dist" (requirejs) task
>> Error: Error: The config in mainConfigFile /…/client.js cannot be used because it cannot be evaluated correctly while running in the optimizer. Try only using a config that is also valid JSON, or do not use mainConfigFile and instead copy the config values needed into a build file or command line arguments given to the optimizer.
>> at Function.build.createConfig (/…/r.js:23636:23)
现在,据我所知,这是因为我使用变量来设置“socket.io”的路径。如果我把它拿出来,需要运行得很好,但我不能从服务器运行原始文件。如果我离开它,我的调试服务器很高兴,但构建会中断。
有没有一种方法可以让我在运行时懒惰地分配“socket.io”的路径,这样它就不必进入 requirejs.config() 方法?