在我的一个项目中,vue-cli遇到了一个非常奇怪的问题。我从未在其他 Vue-cli 设置上看到过类似的行为。
我有多页应用程序,我已将其配置为通过 vue.config 生成多个应用程序.js"pages"属性。每个应用都编译为单个应用版本。这些应用程序一直在工作,但是前段时间我遇到了非常奇怪的问题,其中一个应用程序根本停止初始化。CLI 编译器/观察器没有产生任何错误,Chrome 也没有在控制台上显示任何内容。
我尝试删除部分代码,以确定我写到逻辑的内容是否破坏了它,最后发现如果将任何东西引入其中一个组件样式标签,它会破坏该构建/应用程序的初始化.js。编译器确实产生了编译版本,但由于某种原因,这个应用程序根本没有初始化。即使是该主.js-文件中的 console.logs 也没有向控制台生成任何内容,但浏览器已加载它(确保它不是缓存问题(。我无法找出原因,所以我只是删除了那些样式标签。
今天我再次遇到同样的问题,但这次它来自 mixin-file,它有以下几行:
getCustomerCard(filters) {
return window.$.post(window.vm.url.getCustomerCard, filters).then(result => { return JSON.parse(result) });
},
getCustomerCards(filters) {
return window.$.post(window.vm.url.getCustomerCard, filters).then(result => { return JSON.parse(result) });
},
getWasteEvents(filters) {
return window.$.post(window.vm.url.getUserWasteEvents, filters).then(wasteEvents => { return JSON.parse(wasteEvents) });
},
问题出在"getCustomerCards"方法中,即使它甚至没有在任何地方使用,它也会破坏应用程序初始化。通过删除它,重新编译的构建初始化正常。我已经尝试了此功能中的以下行,所有这些都破坏了应用程序初始化:
return window.$.post(window.vm.url.getCustomerCard, filters);
return window.$.post("window.vm.url.getCustomerCard", filters);
return window.$.post("window.vm.url.getCustomerCard");
return window.$.post("wiabcndow.vm.url.getCustomerCard");
return window.$.post("windowdas.vmbfda.urasl.gesttyrCusfdstomerCsard");
return window.$.post("(window.vm.url");
另一方面,这不会破坏初始化:
return window.$.post("wifdsn/vmbfda");
更令人困惑的是,简单地将getCustomerCard的内容复制到getCustomerCards会破坏初始化。
我以前从未见过这种行为,所以我想知道 Babel 是否有可能因为某种原因破坏了构建?只是重复我自己:我在任何地方都没有看到任何错误,不是在编译中,也不是在浏览器中。
更奇怪的是:中断/不初始化的应用程序甚至根本不使用这个mixin!Mixin 被其他应用程序/主.js使用,所以这个应用程序甚至不应该被破坏!我只是很困惑,无法弄清楚可能是什么问题。
编辑:
我注意到了一些东西...这也破坏了初始化:
getCustomerCards(filters) {
return window.$.post("window.vm.url", filters);
},
。但这不会:
getCustomerCards() {
return window.$.post("window.vm.url");
},
我怀疑编译堆栈或其他东西上一定有一些奇怪的无声错误。
首先在 Vue-CLI 4.3.1 上遇到这个问题。升级到最新的 Vue-Cli 4.4.4,但问题仍然存在。
编辑#2:我还仔细检查了当应用程序不初始化时,它在编译的js文件中仍然有我的"console.log('yes'("。这个控制台.log被添加到main.js,紧接着导入行,在引入和挂载Vue组件之前("新Vue..."(。基本上,编译的构建似乎不会从该主运行任何内容.js当构建静默地"损坏"时。无法弄清楚是什么可能导致初始化以这种方式中断......
我终于解决了这个问题。我无法解释为什么这些某些行似乎以不同的方式工作,并且可能同时发生多个不同的问题,但至少有一个问题是这样的:
基本上我再次偶然发现了这个问题,这次的问题非常相似:两个应用程序,一个共享组件,构建中断/没有错误地初始化。通过某些方式修改代码(就像在原始帖子中一样(,我能够让应用程序工作,稍后使用不同的模组,它再次停止工作。这真的让我很失望!
我比较了源代码的工作版本和损坏版本,并注意到当共享组件损坏时,应用程序中根本不存在它.js例如"客户.js"或"booking.js"(。工作文件和损坏的文件从顶部看都是相同的,所以我并排比较了它们并注意到了这种差异:
/******/ deferredModules.push([2,"chunk-vendors"]);
vs
/******/ deferredModules.push([2,"chunk-vendors", "chunk-common"]);
通过谷歌搜索,我发现了我的怀疑:公共组件被分成chunk-common.js-file。显然在某些情况下,这并没有发生(因此组件源代码内部的修改要么导致创建块公共,要么将代码保留在构建的应用程序.js中(。不幸的是,当应用程序不包含必要的文件时(因为它们在创建 Vue-instance 之前没有在 HTML 文件中导入(,它只是静默地失败而没有错误。真的很令人沮丧。
通过引入chunk-common.js在启动Vue之前,一切都开始按预期工作。我没有在 SPA 上与此功能发生冲突,因为 SPA 没有多个入口点,这些入口点可以构建到多个应用程序构建中。
希望这将帮助有相同问题的人。