Less.js: 在节点 v6.0.0 上损坏

创建于 2016-04-27  ·  41评论  ·  资料来源: less/less.js

跑步

lessc main.less build.css

不会输出任何错误,也不会输出构建文件。

使用nodemon运行会产生更多信息:

› nodemon -e less --exec 'lessc src/main.less build.css'
(node) v8::ObjectTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.

==== JS stack trace =========================================

Security context: 0x36610d2c9fa9 <JS Object>#0#
    1: .node [module.js:568] [pc=0x1aa0081d0f64] (this=0x225da61d89b9 <an Object with map 0x7af7e117be1>#1#,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    2: load [module.js:456] [pc=0x1aa008138e72] (this=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    3: tryModuleLoad(aka tryModuleLoad) [module.js:415] [pc=0x1aa00813899d] (this=0x36610d204189 <undefined>,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_mo 1: v8::Template::Set(v8::Local<v8::Name>, v8::Local<v8::Data>, v8::PropertyAttribute)
 2: fse::FSEvents::Initialize(v8::Local<v8::Object>)
 3: node::DLOpen(v8::FunctionCallbackInfo<v8::Value> const&)
 4: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
 5: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>)
 6: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*)
 7: 0x1aa00800961b
 8: 0x1aa0081d0f64
(node) v8::ObjectTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.

==== JS stack trace =========================================

Security context: 0x36610d2c9fa9 <JS Object>#0#
    1: .node [module.js:568] [pc=0x1aa0081d0f64] (this=0x225da61d89b9 <an Object with map 0x7af7e117be1>#1#,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    2: load [module.js:456] [pc=0x1aa008138e72] (this=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_modules/fsevents/lib/binding/Release/node-v48-darwin-x64/fse.node>)
    3: tryModuleLoad(aka tryModuleLoad) [module.js:415] [pc=0x1aa00813899d] (this=0x36610d204189 <undefined>,module=0x2666c00042f1 <a Module with map 0x7af7e1181b9>#2#,filename=0x2666c0004251 <String[136]: /Users/zigomir/.nvm/versions/node/v6.0.0/lib/node_modules/nodemon/node_mo 1: v8::Template::Set(v8::Local<v8::Name>, v8::Local<v8::Data>, v8::PropertyAttribute)
 2: fse::FSEvents::Initialize(v8::Local<v8::Object>)
 3: node::DLOpen(v8::FunctionCallbackInfo<v8::Value> const&)
 4: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo<v8::Value> const&))
 5: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::(anonymous namespace)::BuiltinArguments<(v8::internal::BuiltinExtraArguments)1>)
 6: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*)
 7: 0x1aa00800961b
 8: 0x1aa0081d0f64
needs decision needs info

最有用的评论

看到一样。 在 Node.js v6 下,即使在详细模式下,在任何微不足道的 .less 文件上运行 lessc 都不会输出构建文件和错误。

所有41条评论

Less 本身不使用任何ObjectTemplate.Set函数,因此它可能是它的依赖项之一。 当前 master 中有很长的依赖更新链,因此很难说获得v6兼容版本可能有多困难。 随意更深入地调查它并提出补丁/公关建议。

这看起来像是 nodemon 的问题,而不是更少

看到一样。 在 Node.js v6 下,即使在详细模式下,在任何微不足道的 .less 文件上运行 lessc 都不会输出构建文件和错误。

我找到了原因:

当前发布的 Less 版本使用undefined调用path.dirname() ,这会在节点 v6 中引发错误。 ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 已经解决了这个问题,但尚未发布。 错误不会被抛出,因为lessc的当前实现吞噬了由 Less 本身引起的所有错误。 我创建了一个 PR 来解决这个问题。

那么,emm,要合并哪一个呢? 第2882章还是第2884章? :)

他们解决了两个不同的问题 IMO

所以两者都有? (我问是因为它们有些重叠并且合并两者都需要一些额外的编辑)。

另一种直接使用process.exit() ,应避免使用,以防止不刷新stdout/stderr

@evanlucas你能描述一下这个直接调用process.exit()的问题是如何重现的吗? 我绝对同意你的观点, process.exit()应该在极少数情况下使用,因为通常最好定期终止它或抛出错误。 然而,在这种情况下,我认为带有错误代码的process.exit()更合适,因为我们不想显示预期错误的堆栈跟踪。 继续执行但用标志阻止进一步处理对我来说似乎也很奇怪(就像它当前已实现的那样)。

设置 process.exitCode 不显示堆栈跟踪。 process.exit()实际上并不刷新process.stdoutprocess.stderr (它们都是非阻塞的)。 您应该只在极少数情况下显式调用它。 否则,关闭所有句柄,事件循环将自行关闭,这将导致进程退出。

相关: https ://github.com/nodejs/node/issues/6409

谢谢澄清这一点。 我不知道process.exit()是非阻塞的。 我将尽快更新我的 PR。

不过有一件事:如果process.exit()没有刷新process.stdout – 为什么我的控制台中有输出? :咧嘴笑:

流关闭时可能已经刷新。 只是不能保证。 这就是控制台中有时(部分)输出的原因。

确认,至少对我们来说,在 head 中运行(包括 https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 ),这得到了解决。

使用“--source-map”仍然会为我生成一个空的 css 文件..(否则为我工作)。 Windows 8 64 位上的 node.js v6.0.0。

@ewebdev是的,我可以确认这一点。 使用#2891,它会抛出:

lessc --source-map-map-inline styles/main.less
path.js:7
    throw new TypeError('Path must be a string. Received ' + inspect(path));
    ^

TypeError: Path must be a string. Received undefined
    at assertPath (path.js:7:11)
    at Object.basename (path.js:1355:5)
    at /Users/jhnns/dev/jhnns/less.js/bin/lessc:292:61
    at Object.<anonymous> (/Users/jhnns/dev/jhnns/less.js/bin/lessc:486:3)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:456:32)
    at tryModuleLoad (module.js:415:12)
    at Function.Module._load (module.js:407:3)
    at Function.Module.runMain (module.js:575:10)

我可以打开一个修复此问题的 PR,但我不确定在哪些情况下支持哪些源映射选项,例如当输出为process.stdout时。 这段代码有点复杂,可能需要一些重构......

确认,这与节点 6 中断。没有错误输出:(

我们还在等待 PR 来解决这个问题吗?

AFAICT,这是固定的,所以等待 npm 包发布..

(其他人应确认。)

@lmeyerov我在提交中看不到它。 并且 PRs #2882 或 #2884 已链接,但没有人说它是 Node 6 的修复程序。所以,据我所知,即使@jhnns找到原因,PR 还不存在? 或者,其中一个 PR 是否修复了 Node 6 的兼容性,但引入了其他尚未修复的错误(源映射)? 有人可以澄清一下吗?

@matthew-dean 对于我们遇到的问题,它表现为lessc没有发出任何东西,我_认为_它已经解决了。 https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 。 当前在 npm 上发布的版本和 4 月 22 日主线之间的某些东西为我们解决了这个问题。

@matthew-dean 使用 ec04a03f1cba3a092d5cd7f7c5d8e28bb43c193 对我有用(我在这里的某个地方看到了它)。

@lmeyerov @matthew-dean _source map_ 对我来说仍然很糟糕,无论是在头部还是在https://github.com/less/less.js/commit/ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 =/

顺便说一句,即使没有错误报告错误修复,也不应该反对发布包含我的 ec04a03 补丁的版本,因此 lessc 至少可以像以前一样在 Node.js v6 上运行。

@addaleax Less 2.7.0 已发布(刚刚发布)。 哪些错误仍然突出? 我应该将它作为“已知错误”添加到此版本中。

这是 _I_ 遇到的唯一一个,加上在失败的情况下没有任何真正的错误输出的“错误”。 不过不能替别人说话。

出于某种原因,源映射通过了所有 Less 测试,但升级后,我也收到源映射错误,而不是在 Node 6.0 环境中。 (发生在节点 4 中。)所以有一些更改刚刚破坏了源映射。

我相信 PR #2834 引入了源地图错误。 在我的系统上恢复提交 470af20 修复了我的源映射问题。 有人(@ewebdev)可以快速确认吗? 如果是这样,我将提交还原并发布 2.7.1 修补程序。

//cc @尼克斯

@matthew-dean 还原提交https://github.com/less/less.js/commit/470af20f641c9b5389475733dfe341aa4c180fba不能解决我的环境中的源映射问题。

@matthew-dean 对不起! 这只是一个性能优化,如果它引起问题,请随时恢复,我们可以稍后再试

这么多的混乱......😁

由于我已经花了一些时间进行调查,所以让我澄清一下:

  • ec04a03f1cba3a092d5cd7f7c5d8e28bb43c1932 修复了bin/lessc中的错误,其中未定义的路径被传递给dirname 。 现在已经发布了,一切都很好👍
  • bin/lessc中仍然存在一个错误,其中未定义的路径被传递给basename 。 只需运行lessc --source-map-map-inline some-file.less并且 less 不会向标准输出发送任何内容。 这个错误还没有 PR。 我试图解决这个问题,但由于没有针对lessc的测试并且有很多不同的选项,我没有足够的信心不破坏其他任何东西......😞
  • 这两个错误都没有报告给用户(例如,显示堆栈跟踪或非零退出代码)。 我的 PR已经解决了这个问题,该 PR 仍在等待中。

@jhnns哦,很酷,我没有看到那个源图。

如果不出意外,可以通过将path.basename(output)更改为path.basename(output || 'undefined');来恢复旧的 Node v5 行为……不过,我想可以跳过output === undefined的整个块。

@jhnns bin/lessc中的错误有什么影响。 这是一个严重的错误吗? Less还完成了吗? 结果是什么? 您能否针对此错误提交特定问题并提供更多详细信息?

我合并了您的 PR 以进行错误报告。

@matthew-dean 见https://github.com/less/less.js/issues/2896

[编辑:没关系,谢谢@matthew-dean]

@ewebdev如果您仍然有关于 Less 2.7.1 的问题,您能否提交一个包含更多详细信息的单独问题?

@claar这是一个单独的问题( @jhnns列表中的第一个问题),已得到解决。 第二项是一个单独的错误, @ewebdev是一个单独的错误。 为了清楚起见,它们需要与这个问题分开。

@nicks它发生了。 你不会是第一个。 如果您可以帮助我们添加测试,以便我们可以检测到将来无法使用的源地图,我们将不胜感激。

顺便说一句,作为一般的 FYI,Less 的开发支持现在有点少(我们的主要贡献者之一因为家庭责任不得不退后一步),所以我们绝对欢迎 Less 开发人员参与到组织层面。 有问题可以单独联系我。

我创建了一个单独的问题。 既然原来的问题已经解决了,我们就可以关闭这个了。

@jhnns听起来不错。 感谢您的跟进。

仍然在节点v6.9.2 LTS 上中断。
运行lessc时什么也没有发生

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

vecerek picture vecerek  ·  5评论

Oskariok picture Oskariok  ·  6评论

rejas picture rejas  ·  6评论

heavyk picture heavyk  ·  3评论

seven-phases-max picture seven-phases-max  ·  6评论