通过 webpack/babel 转换的代码运行模块时,我遇到以下问题:
Module not found: Error: Can't resolve 'coffee-script' in '/node_modules/vm2/lib'
@ ./~/vm2/lib/main.js 19:10-34
@ ./~/vm2/index.js
@ ./lib/config.js
@ ./lib/server.js
https://github.com/patriksimek/vm2/blob/master/lib/main.js#L19
在这一行中,您使用的是coffee-script
模块,但它没有定义为模块依赖项。
因此,当 webpack 尝试映射所有需求时,它会崩溃,因为它无法在任何地方找到coffee-script
模块。
UPD:这不是功能请求,这是 vm2 模块依赖问题。 在此模块存在此行之前,它不会在没有安装咖啡脚本模块的任何环境中与指定为coffee-script
的编译器选项一起使用。
感谢您报告问题。 我几乎没有使用 Webpack 的经验,所以我错了,但是如果你在父项目中添加coffee-script
作为依赖项怎么办? 我假设 Webpack 进程需要与 Node 相同的方式 - 它搜索所有node_modules
文件夹直到根目录。
我不想仅仅因为您的模块需要它而添加coffee-script
作为我自己项目的依赖项。 我不使用coffee-script
。
如果您在自己的项目中使用某人的模块,则必须将其声明为依赖项。
此外,如果有人将安装您的模块并且该人不会在任何地方(在项目或全局中)安装coffee-script
模块,它也会触发该错误。 它不依赖于 Webpack。
好的,我以为您正在使用咖啡脚本。 在这种情况下,这个库不是 webpack 兼容的 atm。 如果我有空闲时间,我会试着弄清楚这一点。
这不是与 webpack 兼容的情况。
这是您如何发布模块并将其提供给 npm 的一个案例。
我不同意,这个库在没有咖啡脚本的情况下可以正常工作,所以没有理由将它链接为必需的依赖项。 它仅在用户明确声明他或她想要使用咖啡脚本时使用。 我会将其重构为某种插件机制。
原因是您在代码中明确要求coffee-script
,假设它应该以某种方式安装。
如果你已经在你的机器上安装了coffee-script
- 那没关系并且可以工作,否则当我没有在任何地方安装coffee-script
并启动带有编译器选项集的虚拟机时,它会导致问题到“coffeescript”、“coffee-script”、“cs”或“text/coffeescript”之一(如 https://github.com/patriksimek/vm2/blob/master/lib/main.js#L14- L18)。
另外,我不同意这是feature request
,因为如果您的模块尚未安装,则它不能与coffee-script
编译器一起使用。 并且文档没有说明预安装coffee-script
的要求。
是的,您已经准确地描述了它现在是如何工作的。 如果编译器设置为咖啡,库希望用户安装咖啡脚本。
您对文档是正确的,它已更新。
是的,文档修复并不能解决问题。 您的代码中仍然有require('coffee-script')
行,这将产生错误,至少对于 webpack 而言。
是的,正如我在上一篇文章中所写的,我将把它重构为某种插件机制,以便它与 webpack 兼容。
没关系,如果您很难运行一个简单的命令:
> npm install coffee-script --save
我将不再使用也不会等待您的项目解决问题。
@patriksimek 就个人而言,我看到了拥有某种插件机制的好处。
像options.compiler
这样简单的函数怎么样?
然后需要 CoffeeScript 的用户可以将options.compiler
设置为(code) => { return require('coffee-script').compile(code, {header: false, bare: true}); }
。
@dkfiresky哇,你真的希望我强迫成千上万的用户下载咖啡脚本,即使他们不需要它,只是因为你不愿意等待一个合适的解决方案? 那很伤心。
@n-riesco 实际上这已经被支持了。 问题是放弃对coffeescript
选项的支持是一个重大变化,我想先尝试一个更好的解决方案(如果有的话)。
@patriksimek我希望您能正确交付您的模块。 使用咖啡脚本是您自己的责任。 如果使用它,则必须将其定义为依赖项。 如果您不同意,请删除该 require 语句和将coffee-script
声明为选项的编译器选项。
之所以创建此问题,是因为您的模块无法开箱即用。 等待 18 天让您运行一个简单的安装命令听起来像是一个笑话。
此外,如果您声明您的模块编译coffee-script
,则必须将该模块作为依赖项交付到您的 package.json中。
你真的希望我强迫成千上万的用户下载咖啡脚本
这就是您在代码中通过require('coffee-script')
所做的事情。 即使我不使用它,您也希望我安装咖啡脚本。
等待 18 天让您运行一个简单的安装命令听起来像是一个笑话。
你仍然期望我做我说过我永远不会做的事。 再说一遍 - 这个模块目前与 Webpack 不兼容,请不要使用这个库。
@patriksimek此模块在没有安装coffee-script
的任何环境中不兼容也不可运行。
@dkfiresky当然,如果您这么认为的话。 我不再有兴趣说服你你错了。 我们可以请停止这种无用的讨论吗?
@patriksimek是的,当然。 请阅读一些 npm 文档。
我在一个新的反应项目中也得到了这个,在我添加 vm2 作为依赖项之前,我没有关于咖啡脚本的错误
Failed to compile.
/Users/mark/node_modules/coffee-script/lib/coffee-script/coffee-script.js
Module not found: Can't resolve 'module' in '/Users/mark/node_modules/coffee-script/lib/coffee-script'
尽管讨论的语气不是很有建设性,但我真的认为应该添加coffee-script
作为依赖项。 这将是一个非常简单的解决方案,并且允许在各种环境中使用这个包(例如 Webpack、Next 等)。
最有用的评论
@dkfiresky哇,你真的希望我强迫成千上万的用户下载咖啡脚本,即使他们不需要它,只是因为你不愿意等待一个合适的解决方案? 那很伤心。
@n-riesco 实际上这已经被支持了。 问题是放弃对
coffeescript
选项的支持是一个重大变化,我想先尝试一个更好的解决方案(如果有的话)。