"ERROR in window is not defined"是webpack在运行"webpack --mode=production --env.prod"命令时出现的一般错误。

3
我是一个有用的助手,可以为您翻译文本。
我尝试部署我的第一个Angular应用程序,在执行部署过程中,在以下命令的中间部分出现问题:
node node_modules/webpack/bin/webpack.js --mode=production --env.prod

(也称为webpack --mode=production --config webpack.config.js --env.prod

我得到了一个一般性的错误信息,没有比以下更多的信息:

Hash: 7b126cdcbdda85d6b0f304152e501136ec85ed58
Version: webpack 4.6.0
Child
    Hash: 7b126cdcbdda85d6b0f3
    Time: 13298ms
    Built at: 2018-04-23 12:27:51
     1 asset
    Entrypoint main-client = main-client.js

    ERROR in window is not defined
Child
    Hash: 04152e501136ec85ed58
    Time: 13281ms
    Built at: 2018-04-23 12:27:51
     1 asset
    Entrypoint main-server = main-server.js

    ERROR in window is not defined

主服务器和主客户端都是由webpack生成的文件,我代码中唯一使用"window"的地方是执行window.history.back()命令,但即使注释掉它,错误仍然出现。

有人知道如何解决吗?

我的webpack版本是4.6.0。

1个回答

3

这可能是因为你在代码中直接引用了window。这不是最佳实践!有时(在服务器端),窗口对象未定义会导致此类问题。如果第三方库使用了它也会出现同样的问题。

因此,请先检查您的代码,找到您直接使用window的位置,并像以下示例一样将其包装在PLATFORMID中:

 import { PLATFORM_ID } from '@angular/core';
 import { isPlatformBrowser, isPlatformServer } from '@angular/common';
 
 constructor(@Inject(PLATFORM_ID) private platformId: Object) { ... }
 
 ngOnInit() {
   if (isPlatformBrowser(this.platformId)) {
      // Client only code.
      ...
   }
   if (isPlatformServer(this.platformId)) {
     // Server only code.
     ...
   }
 }

如果你找不到它,可能是因为某个库仍在使用它。请检查 github 上的此问题,它会比我更好地解释问题:https://github.com/webpack/react-starter/issues/37希望这能对您有所帮助 =)PS:当我必须实现服务器端渲染时也出现了同样的问题。 我在代码中无处不用 window。从那时起,每当我需要使用它时,我总是能找到另一种做同样事情的方法。你也可以尝试将 target: "web" 放入你的 webpack.config.js 中。
编辑自提问者 另请参阅 github 上的此问题,它提供了此问题的解决方案:https://github.com/webpack/webpack/issues/7112

谢谢Luca。我认为问题与某个库有关,因为我刚刚用Angular内置的location.back()功能替换了所有Windows出现的地方。顺便问一下,我怎么检查一个库是否在使用“window”? - Santa Cloud
1
很遗憾,我没有确切的答案回答你的问题,但是在我的项目中,我发现在 node_modules 上进行“文件夹查找”,显然要排除 @angular 和 selenium(或任何来自 angular cli 依赖项的库)。这不是一个完美的方法,但我找到了一些关于 window.documentwindow.location 的参考资料。 - Luca Taccagni
1
谢谢!通过使用TotalCommander搜索,我发现JQuery正在使用"window"。我需要找到一个解决办法。如果它有效,我会将您的答案标记为已接受,否则我会在另一条评论中告诉您。目前为止,非常感谢您! :) - Santa Cloud
我已经删除了JQuery模块,但问题仍然存在。我发现有很多必要的模块使用它,甚至包括Angular原生的模块。你知道如何避免这个问题而不删除库吗?提前感谢! - Santa Cloud
1
你的编辑已经足够接近回答问题了。但我仍然建议将你的窗口包装在一个平台ID case中(如果你直接引用窗口或一些库方法来做这件事)。你可以尝试在webpack配置文件的“target”中加入“web”吗? - Luca Taccagni
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接