<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Tern</title>
	<atom:link href="https://blog.gmem.cc/tag/tern/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Thu, 16 Apr 2026 11:50:59 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>使用Tern增强Eclipse的JS代码提示</title>
		<link>https://blog.gmem.cc/tern-based-content-assist</link>
		<comments>https://blog.gmem.cc/tern-based-content-assist#comments</comments>
		<pubDate>Tue, 29 Dec 2015 12:54:09 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[Tern]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=10395</guid>
		<description><![CDATA[<p>Tern简介 Tern（tern.js）是一个独立的JavaScript代码分析引擎（code-analysis engine），可以增强代码编辑器的功能。它具有以下特性： 变量、属性的代码提示 函数参数提示 判断一个表达式的类型 定位类型的定义 自动化重构操作 支持大量流行JavaScript框架 Tern本身基于JavaScript编写，可以在Node.js和浏览器中运行。 Tern目前支持的编辑器包括：Emacs、Vim、Sublime Text、Brackets、Light Table、Eclipse等。 Tern的组件架构 架构图如下： 说明： 运行在最上层的，是各种编辑器插件。它们充当客户端角色 编辑器插件通过基于HTTP的简单的JSON协议，向Tern服务器发出处理请求 Tern服务器本质上是Node.js应用，因此它依赖于Node.js运行时环境 Tern服务器采用插件式架构，可以开发不同的模块（Server Module），以支持多种JavaScript框架的代码提示。模块把类型推断的工作交由类型推断引擎处理 类型推断引擎可以：在给定的上下文和抽象语法树（AST）下，推断代码中变量和属性的类型 <a class="read-more" href="https://blog.gmem.cc/tern-based-content-assist">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/tern-based-content-assist">使用Tern增强Eclipse的JS代码提示</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">Tern简介</span></div>
<p>Tern（tern.js）是一个独立的JavaScript代码分析引擎（code-analysis engine），可以增强代码编辑器的功能。它具有以下特性：</p>
<ol>
<li>变量、属性的代码提示</li>
<li>函数参数提示</li>
<li>判断一个表达式的类型</li>
<li>定位类型的定义</li>
<li>自动化重构操作</li>
<li>支持大量流行JavaScript框架</li>
</ol>
<p>Tern本身基于JavaScript编写，可以在Node.js和浏览器中运行。</p>
<p>Tern目前支持的编辑器包括：Emacs、Vim、Sublime Text、Brackets、Light Table、Eclipse等。</p>
<div class="blog_h2"><span class="graybg">Tern的组件架构</span></div>
<p>架构图如下：</p>
<p><img class="aligncenter size-full wp-image-10433" src="https://blog.gmem.cc/wp-content/uploads/2015/12/ternjs-arch.jpg" alt="ternjs-arch" width="500" height="461" /></p>
<p>说明：</p>
<ol>
<li>运行在最上层的，是各种编辑器插件。它们充当客户端角色</li>
<li>编辑器插件通过基于HTTP的简单的JSON协议，向Tern服务器发出处理请求</li>
<li>Tern服务器本质上是Node.js应用，因此它依赖于Node.js运行时环境</li>
<li>Tern服务器采用插件式架构，可以开发不同的模块（Server Module），以支持多种JavaScript框架的代码提示。模块把类型推断的工作交由类型推断引擎处理</li>
<li>类型推断引擎可以：在给定的上下文和抽象语法树（AST）下，推断代码中变量和属性的类型</li>
</ol>
<div class="blog_h2"><span class="graybg">tern.java</span></div>
<p>tern.java是tern.js的衍生项目，允许在Java上下文中使用tern.js。tern.java提供几种<span style="background-color: #c0c0c0;">Tern服务器</span>实现，分别基于J2V8、 Rhino、 Java 8 Nashorn、 Node.js等JavaScript引擎/运行环境，tern.js在这些引擎中运行，而tern.java则对tern.js进行了基于Java的API封装。</p>
<p>Tern.java是 Tern Eclipse IDE的支撑技术。</p>
<div class="blog_h1"><span class="graybg">安装和配置Tern Eclipse IDE</span></div>
<p>该插件用于把Tern集成到Eclipse中，最好在Eclipse IDE for Java EE Developers的基础上安装此插件，因为它依赖于WebTools、JSDT 。</p>
<p>Tern Eclipse IDE增强了Eclipse自带JavaScript Editor、JSP Editor、HTML Editor的代码提示功能。</p>
<div class="blog_h2"><span class="graybg">安装插件</span></div>
<p>Update Site：http://oss.opensagres.fr/tern.repository/1.1.0/</p>
<p>可以选择所有组件并安装。</p>
<div class="blog_h2"><span class="graybg">全局配置</span></div>
<p>Tern Eclipse IDE的全局配置项位于：Window  ⇨ Preferences  ⇨ JavaScript  ⇨ Tern，具体说明如下：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 35%; text-align: center;">配置项</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>Content Assist</td>
<td>Indent with 4 Spaces</td>
</tr>
<tr>
<td>Development</td>
<td>Trace on console 勾选后，可以看到Tern详细的活动日志</td>
</tr>
<tr>
<td>Server ⇨ Node.js</td>
<td>Node.js install，可以选择其他Node.js安装位置</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">工程配置</span></div>
<p>要让一个Eclipse工程使用Tern，需要在工程上右击 ⇨ Configure ⇨  <span style="background-color: #c0c0c0;">Convert to Tern Project</span>。系统会自动弹出对话框，让你选择需要启用的<span style="background-color: #c0c0c0;">Tern模块（Module）</span>，这些模块为流行JavaScript框架提供代码提示。</p>
<p>在以后，你可以而随时工程上右击 ⇨ Properties ⇨ JavaScript ⇨ Tern，增加需要的模块。</p>
<div class="blog_h3"><span class="graybg">配置Script Paths</span></div>
<p>为了实现自动完成、代码跟踪，Tern Eclipse IDE需要知道你引用的JS库的源码位置。默认的，当前工程中的所有源码会自动识别。</p>
<p>如果要引用位于其它工程中的源码，可以在工程上右击，定位到 Properties ⇨ JavaScript ⇨ Tern ⇨ Script Paths进行设置。</p>
<div class="blog_h1"><span class="graybg">在Eclipse中使用Tern</span></div>
<div class="blog_h2"><span class="graybg">使用JSDoc</span></div>
<p><a href="http://usejsdoc.org/">JSDoc</a>是一套JavaScript注释的规范，类似于JavaDoc。它定义了一系列@开头的符号，作为被注释函数、变量的元数据。</p>
<p>通过JSDoc模块（该模块现在自动启用），我们可以为Tern提供<span style="background-color: #c0c0c0;">类型提</span>示，以便Tern进行合理的代码提示：</p>
<pre class="crayon-plain-tag">/**
 * @param {string}
 *          str1
 * @param {string}
 *          str2
 * @returns {Number}
 */
function addStr( str1, str2 ) {
    //在函数内部，str1、str2获得Content Assist，可以Alt + /调出提示
}
addStr("","").toFixed(0); //在函数外部，返回值获得Content Assist
/**
 * @type {string}
 */
var str //可以为任意变量提示类型</pre>
<p>这一功能与Pydev的Type Hinting很类似。</p>
<p>在工程上右击 ⇨ Properties ⇨ JavaScript ⇨ Tern，勾选When Enabled, types specified in comments ...，可以<span style="background-color: #c0c0c0;">启用Strong模式</span>：JSDoc中指定的类型，比上下文自动推断（例如把变量复制给与@type不兼容的类型）优先。</p>
<div class="blog_h2"><span class="graybg">使用Tern Linter进行JS验证</span></div>
<p>从0.9开始，Tern Eclipse IDE提供对Eclipse WTP Validator的集成，通过几种Linter来验证JavaScript文件：</p>
<ol>
<li>Lint：进行语义检查，其它Linter主要进行语法检查。例如<pre class="crayon-plain-tag">new Date().setHours("1")</pre> 虽然语法上没有错误，但是无法通过Lint验证</li>
<li>ESLint：提供最好的ES6支持，并且提供对JSX语言的支持。该ESLint貌似不太好用，开启对应Tern模块后，没有效果</li>
<li>JSHint：从JSLint分支而来，提供更好的可配置性。内置对jQuery、Node.js等框架的支持，提供对ES6的基本支持。缺点是难以确定是哪个规则引发了错误</li>
<li>JSCS：主要进行<span style="background-color: #c0c0c0;">编程风格的检查</span>，不检查潜在的编程BUG</li>
</ol>
<p>这些Linter有对应的Tern模块。推荐使用Lint + JSLint的组合。</p>
<div class="blog_h3"><span class="graybg">Lint</span></div>
<p>Tern模块Lint可以用于对JavaScript代码进行检查，发现常见的编程错误，例如：未知属性、未知标识符、调用一个不是函数的对象、传递无效参数、类型转换错误，等等。启用该模块后，应当<span style="background-color: #c0c0c0;">同时启用JSDoc的Strong模式</span>。</p>
<p>在工程上右击 ⇨ Validate可以触发验证。下面的代码导致警告：</p>
<pre class="crayon-plain-tag">/**
 * @type {string}
 */
var str;
str = 1;  //[Lint]: Type mismatch: cannot convert from string to number</pre>
<div class="blog_h3"><span class="graybg">JSHint</span></div>
<p>启用此Tern模块后，可以在工程上右击 ⇨ Properties ⇨ JavaScript ⇨ Tern ⇨ Validation ⇨ JSHint中对JSHint进行配置。</p>
<p>可以通过Eclipse的图形化界面配置，也可以指定<pre class="crayon-plain-tag">.jshintrc</pre> 配置文件。可用的配置项如下表：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">配置项</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;" colspan="2">Enforcing options：这些选项如果设置为true，JSHint会产生更多的警告信息</td>
</tr>
<tr>
<td>bitwise</td>
<td>禁止使用JavaScript中很少见的位运算符</td>
</tr>
<tr>
<td>curly</td>
<td>强制要求使用{}包围if/while等语句块</td>
</tr>
<tr>
<td>eqeqeq</td>
<td>强制要求使用===、!==代替==、!=。后两者会在比较前进行类型转换，常常导致意外错误：<pre class="crayon-plain-tag">1 == "1"</pre> </td>
</tr>
<tr>
<td>esversion</td>
<td>强制要求代码遵循ECMAScript版本：<br />3：IE6-9等老浏览器的版本<br />5：提示JSHint你的代码使用ECMAScript 5.1 <br />6：提示JSHint你的代码使用ECMAScrip6，不是所有浏览器实现了ES6</td>
</tr>
<tr>
<td>forin</td>
<td>强制要求在使用for..in迭代对象属性时，过滤从原型链继承得到的属性：<br />
<pre class="crayon-plain-tag">for ( var key in obj ) {
    if ( obj.hasOwnProperty( key ) ) {
        // 这是对象自己定义，而不是继承自原型链的属性
    }
}</pre>
</td>
</tr>
<tr>
<td>freeze</td>
<td>禁止覆盖Native类型的原型，例如Array、Date</td>
</tr>
<tr>
<td>futurehostile</td>
<td>如果标识符占用了未来版本JavaScript的关键字，发出警告</td>
</tr>
<tr>
<td>globals</td>
<td>指定一个全局变量的白名单，这些变量虽然没有在源码中明确定义，但是JSHint不会发出警告</td>
</tr>
<tr>
<td>latedef</td>
<td>禁止在定义前使用变量。实质上JavaScript只有函数级作用于，所有变量的定义都会被提前到函数的首部</td>
</tr>
<tr>
<td>maxdepth</td>
<td>控制代码块的最大层次</td>
</tr>
<tr>
<td>maxerr</td>
<td>JSHint最大生成的错误个数，默认50</td>
</tr>
<tr>
<td>maxparams</td>
<td>允许函数的最大参数个数</td>
</tr>
<tr>
<td>maxstatements</td>
<td>允许函数的最大语句行数</td>
</tr>
<tr>
<td>noarg</td>
<td>禁止使用arguments.caller、arguments.callee</td>
</tr>
<tr>
<td>nocomma</td>
<td>禁止使用逗号操作符</td>
</tr>
<tr>
<td>nonew</td>
<td>禁止调用构造器却不赋值给变量</td>
</tr>
<tr>
<td>strict</td>
<td>要求代码在ECMAScript 5的strict模式下运行</td>
</tr>
<tr>
<td>undef</td>
<td>禁止使用未定义的变量</td>
</tr>
<tr>
<td>unused</td>
<td>对未使用的变量发出警告</td>
</tr>
<tr>
<td>varstmt</td>
<td>禁止使用var声明变量，必须使用let、const代替</td>
</tr>
<tr>
<td style="text-align: center;" colspan="2">Relaxing options：这些选项如果设置为true，JSHint会产生更少的警告信息</td>
</tr>
<tr>
<td>asi</td>
<td>抑制对缺失分号的警告</td>
</tr>
<tr>
<td>boss</td>
<td>抑制对期望==而使用了=（例如<pre class="crayon-plain-tag">if (a = 10) {}</pre> ）的警告</td>
</tr>
<tr>
<td>eqnull</td>
<td>抑制针对== null这种比较方式的警告</td>
</tr>
<tr>
<td>evil</td>
<td>抑制对eval()调用的警告，该调用不被建议，因为容易导致代码注入而出现安全问题</td>
</tr>
<tr>
<td>funcscope</td>
<td>尽管JavaScript只有全局、函数两个作用域，但是默认的，JSHint会对：块外引用块内声明的变量的情况予以警告<br />该选项设置为true，则抑制此警告</td>
</tr>
<tr>
<td>iterator</td>
<td>抑制对使用__iterator__属性的警告，__iterator__不被所有浏览器支持</td>
</tr>
<tr>
<td>loopfunc</td>
<td>抑制对在循环中定义函数的警告</td>
</tr>
<tr>
<td>notypeof</td>
<td>抑制对错误的typeof比较值的警告，默认JSHint对<pre class="crayon-plain-tag">typeof a == "functio"</pre> 发出警告，因为functio不是有效的类型</td>
</tr>
<tr>
<td>proto</td>
<td>抑制对使用__proto__属性的警告</td>
</tr>
<tr>
<td>scripturl</td>
<td>抑制对使用javascript:形式的URL的警告</td>
</tr>
<tr>
<td>supernew</td>
<td>抑制对new function () { ... }、new Object的警告，这种代码有时用于创建单例</td>
</tr>
<tr>
<td>withstmt</td>
<td>抑制对使用with语句的警告</td>
</tr>
<tr>
<td style="text-align: center;" colspan="2">Environments：让JSHint知晓某些预定义全局变量</td>
</tr>
<tr>
<td>browser</td>
<td>定义现代浏览器暴露的全局变量，包括很早就有的document、navigator以及HTML5引入的FileReader等</td>
</tr>
<tr>
<td>devel</td>
<td>定义一些调试用于的全局变量，包括console、alert</td>
</tr>
<tr>
<td>browserify</td>
<td>与Browserify tool联用</td>
</tr>
<tr>
<td>couch</td>
<td>与CouchDB联用</td>
</tr>
<tr>
<td>dojo</td>
<td>与Dojo Toolkit联用</td>
</tr>
<tr>
<td>jquery</td>
<td>与jquery联用</td>
</tr>
<tr>
<td>module</td>
<td>提示JSHint，代码正在使用ECMAScript6模块</td>
</tr>
<tr>
<td>node</td>
<td>提示代码运行在Node.js环境中</td>
</tr>
<tr>
<td>nonstandard</td>
<td>定义一些非标准但是广泛使用的全局变量，包括escape、unescape</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">支持AngularJS开发<a id="support-for-angularjs"></a></span></div>
<div class="blog_h2"><span class="graybg">angularjs-eclipse简介</span></div>
<p>该插件基于tern.java，为Eclipse WTP增加以下特性：</p>
<ol>
<li>让WTP自带HTML编辑器、JSP编辑器支持AngularJS表达式和指令</li>
<li>增加一个视图Angular Explorer，可以以树形结构显示AngularJS模块、控制器</li>
<li>让WTP自带JavaScript编辑器支持AngularJS特性（例如模块）</li>
</ol>
<div class="blog_h2"><span class="graybg">安装与配置angularjs-eclipse</span></div>
<p>Update Site：http://oss.opensagres.fr/angularjs-eclipse/1.1.0/</p>
<p>可以选择全部插件安装，如果你安装过Tern Eclipse IDE，则其中部分插件已经安装到你的Eclipse中了。</p>
<div class="blog_h3"><span class="graybg">全局配置</span></div>
<p>Window ⇨ Preferences ⇨AngularJS，可以配置语法高亮。</p>
<p>Window ⇨ Preferences ⇨ Web ⇨ HTML Files ⇨ Web Resources把Error的严重级别改为Warning级别，如果使用Framework7，全部改为忽略。</p>
<div class="blog_h3"><span class="graybg">工程配置</span></div>
<p>CSS样式类自动提示：工程上右击 ⇨ Properties ⇨  Web Resources ⇨ CSS，勾选“Search CSS id and class in all CSS file”。</p>
<div class="blog_h2"><span class="graybg">使用angularjs-eclipse</span></div>
<p>要让一个Eclipse工程支持AngularJS开发，需要在工程上右击 ⇨ Configure ⇨ Convert to AngularJS Project。该操作会生成一个.tern-project文件，并且为工程添加angular nature。</p>
<p>现在，你的HTML、JSP、JavaScript编辑器就支持AngularJS的语法高亮、代码提示了。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/tern-based-content-assist">使用Tern增强Eclipse的JS代码提示</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/tern-based-content-assist/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
