23

我正在编写一些节点命令行实用程序。它们都从以下行开始:

#!/usr/bin/env node

使用 Eclipse Juno 和 Nodeclipse Node.js 插件,这行代码会产生如下所示的错误:

节点shebang eclipse错误

好的,所以#它不是 javascript 中的有效注释字符,但它是 Linux/UNIX 中的有效字符,作为文件第一行的shebang。但是我怎样才能设置 Eclipse 来忽略这个错误呢?这对我来说是个问题,因为如果您有错误,代码格式将不起作用。我必须删除该行。点击CTRL-SHIFT-F并添加回线。

我已经尝试了很多东西并进行了研究,但我找不到答案。

那里有一个重复的问题,eclipse javascript syntax error on hashbang line,但我的问题有更多信息。

编辑:

看起来在jshint 中添加了一些东西以允许在第一行使用 shebangs。也许我需要更新我的 node-eclipse,或者 node-eclipse 项目需要更新 jshint?

  • 我的 jshint eclipse 集成是 0.9.6 版。
  • 我的nodeclipse是0.4.0.20130519 ...

我升级到

  • jshint eclipse 集成 0.9.9.20131029
  • 节点日食 0.7.0.20131101

那没有帮助。

这是我在 Eclipse 中的 JSHint 版本:

在此处输入图像描述

编辑2:

感谢VonC的回答。但我认为这表明我在文件中没有 BOM。还有其他想法吗?

$ od -N 20 -t x1 hello.js
0000000 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 6e
0000020 6f 64 65 0a
0000024

编辑 3:

关于下面 Paul Verest 的回答,我尝试关闭 JSDT 验证,但我似乎无法做到。我取消选中“启用 JavaScript 语义验证”(在 Eclipse 中,请参阅 Window > Preferences > JavaScript > Validator > Errors/Warnings),但问题仍然存在。

我现在正在卸载Eclipse Web Developer Tools 3.4.2。这似乎没有帮助,现在我的 CSS 和 HTML 编辑器不见了。现在我试图通过遵循这个 SO 问题中的一些想法来禁用 JSDT 验证,如何从我的 Eclipse 项目中删除 javascript 验证?.

所以我进入我的项目属性并转到 JavaScript > Validation。我已将所有内容设置为“启用项目特定设置”并取消选中“错误/警告”、“JSDOC”等。即便如此,我认为验证仍在运行,因为问题仍然存在!我的“Builders”属性只列出了启用的“JSHint Problem Checker”。(我在一个带有 hello.js 的新测试项目上做这一切)。

编辑 4,答案

这并不容易,但我最终破解了 Eclipse 中的 .project 文件。我有这个:

<natures>
    <nature>org.nodeclipse.ui.NodeNature</nature>
    <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>

我删除了 jsdt 性质,现在 shebang 线上的错误消失了!我在我的测试项目和我的真实项目中做到了这一点。有效!这实际上非常有用,因为我可以格式化文件并且我现在实际上正在运行 jshint。

4

2 回答 2

6

Eclipse 中有两个 JavaScript 验证选项:

  • JSDT
  • JSHint(从 Nodeclipse 0.7 开始默认)

由于每个项目都存储配置,因此从使用 0.7 创建的项目中复制 .* 设置文件或手动重新配置它(只需将 .* 文件与新创建的项目进行比较)。然后把 .jshintrc 文件像 https://github.com/Nodeclipse/nodeclipse-1/blob/master/org.nodeclipse.ui/templates/.jshintrc

如果可能,请尝试检查JSHint options 。

请注意,使用 JSHint 时,~~这个问题变成了一般 JSHint 问题(与 Eclipse 或 Nodeclipse 无关)。~~

更新:

.project从 0.7 开始的内容:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>ProjectName</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>com.eclipsesource.jshint.ui.builder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.nodeclipse.ui.NodeNature</nature>
        <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
    </natures>
</projectDescription>

@Jess 发现这是 JSDT 显示的错误,而不是 JSHInt,因此删除<nature>org.eclipse.wst.jsdt.core.jsNature</nature>将阻止 JSDT 显示它(即使 JavaScript 语义验证自 0.7 以来已关闭)

更新 3:

删除的缺点<nature>org.eclipse.wst.jsdt.core.jsNature</nature>是代码辅助和点击定义将不起作用(它实际上在定义 JSDocs 的极少数情况下有效,例如http://www.nodeclipse.org/nodejs/javascript/sources/books/2013/10 /22/JSDT-require-JSDoc.html或 1 个 .js 文件内)

JSDoc 支持

甚至点击定义 点击定义

于 2013-11-13T12:09:37.427 回答
4

更新:

在 nodeclipse 中输入的问题指向 JSHint issue 66
正如Paul Verest他的回答中所说(赞成),这可能就像确保 JSHint 检查代码一样简单。
提交 63da9以来,JSHint 知道如何忽略该 shebang 指令。

// If the first line is a shebang (#!), remove it and move on.
// Shebangs are used by Node scripts.
if (lines[0] && lines[0].substr(0, 2) == '#!')
  lines.shift();

原始答案

您确定 ' #' 不是有效字符(尚未在此问题中使用)吗?

仔细检查node.js文件的编码,因为如果它是带有 BOM的 UTF-8 ,那么 javascript 将无法正确启动。

请参阅“没有 BOM 的 utf-8 和 utf-8 有什么不同? ”以及关于 shebang 的维基百科文章(“幻数”部分)

shebang 字符由扩展 ASCII 编码中的相同两个字节表示,包括 UTF-8,它通常用于当前类 Unix 系统上的脚本和其他文本文件。
但是,UTF-8 文件可能以可选的字节顺序标记 (BOM) 开头;如果 " exec" 函数专门检测字节0x23 0x21,那么在0xEF 0xBB 0xBFshebang 之前存在 BOM() 将阻止脚本解释器被执行。出于这个原因以及更广泛的互操作性和哲学问题,
一些权威机构建议不要在 POSIX(类 Unix)脚本中使用字节顺序标记。

于 2013-11-11T18:59:50.193 回答