写给Java开发者的Node.JS简介
KatCable
8年前
<h3>前言</h3> <p>今天上推特看见这篇文章,点进去发现是新货。</p> <p>正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解。</p> <p>才疏学浅,如有不妥之处请指正。</p> <h3>正文</h3> <p style="text-align:center"><img src="https://simg.open-open.com/show/15d26348b7d602f11a151d45e58f5d21.png"></p> <p>在我举办的Node.js研讨会、开设的课程以及编撰的书之中(尤其是我在线教学的时候),最大的受众便是Java开发者。因为在很久以前,作为一位专业的软件开发人员,你必须得知晓Java这门语言。然而现在情况大不相同,Node.js以及其他语言诸如Go、Elixir、Python、Clojure的蓬勃发展,表明工程师们更倾向选择多语言环境作为他们的开发工具。</p> <p>Node.js,一种跑在服务器上的JavaScript运行时,设置起来既简单又快速,因此在从前属于Java的服务器领域中广受好评。这篇文章将用以下几个小节,帮助Java开发者向Node转型:</p> <ul> <li>给Java开发者看的Node术语</li> <li>类型</li> <li>模块</li> <li>异步</li> </ul> <p>给Java开发者看的Node术语</p> <p>既然你是一名Java开发者,那么就请允许我用你熟悉的Java名称和概念来介绍Node术语:</p> <ul> <li>console.log('Hello') 相当于 System.out.println("Hello");</li> <li>npm相当于Apache Maven(但是npm集成捆绑了Node)</li> <li>npmjs.org相当于mvnrepository.com</li> <li>Mongoose/Sequelize/Juggler/Waterline/Bookshelf相当于Hibernate: Persistence Object Relation/Document Mapper framework(都是对象关系持久化/文档映射框架)</li> <li><a href="/misc/goto?guid=4958837620173308012" rel="nofollow,noindex">Loopback</a> (Node.js API框架)相当于Spring MVC(都是Web应用的MVC框架)</li> <li>Express middleware(Express中间件)相当于 <a href="/misc/goto?guid=4959736861449354298" rel="nofollow,noindex">Servlet filters</a> (都是Web应用的代码重用)</li> <li>Atom/VS Code相当于Eclipse(都是写代码的工具)</li> <li>Webstorm相当于IntelliJ IDEA(都是出自Jet Brains的IDE)</li> <li>Webpack/Grunt/Gulp相当于Ant/SBT/Gradle(都是构建工具,Node需要被解释器翻译而非编译成二进制码,这种翻译通常被称为Transpilation)</li> <li>Node非阻塞I/O相当于NIO</li> <li>MongoDB/PostgreSQL相当于Oracle database</li> <li>V8相当于JVM</li> <li>node debug 相当于 jdb (都是命令行调试器)</li> <li>Node Inspector相当于JVE(都是可视化调试器)</li> <li>Node基金会相当于Oracle公司(然而Node基金会是非盈利的)</li> <li>nvm/n/nave相当于jenv(都用于版本管理)</li> <li>Mocha相当于Junit</li> <li>Winston相当于Log4J</li> </ul> <p>只要把以上的推论熟记于心,就能够加速Node学习。</p> <p>这其中有几条的说法比较牵强,比如MongoDB属于NoSQL而Oracle几乎可以说是一个SQL数据库。</p> <p>既然已经介绍了一些Node基本术语,接下来我们将面对一些常见问题,在我的直播课程中经常有人提出这一类问题,即Node/JavaScript与Java的区别。</p> <h3>类型</h3> <p>在Node/JavaScript中,类型非常宽松。每一个变量都能够存储任何类型的数据,也就是说,是存储在变量中的数据决定了这个变量的类型,而非变量本身。例如:</p> <pre> <code class="language-javascript">let str = 10 console.log(typeof str) // -> number str = '现在这是个字符串了' console.log(typeof str) // -> string</code></pre> <p>同样在函数的声明中,不需要为函数参数指定类型。例如,参数 page 可以是一个数字类型也可以是一个函数,因为它是一个可选的参数:</p> <pre> <code class="language-javascript">const f = function (limit, page, callback) { if (typeof page == 'function' && !callback) { callback = page page = 1 } // ... return callback() } f(10, ()=>{}) // 可行 f(10, 2, ()=>{}) // 同样可行</code></pre> <h3>模块</h3> <p>Node模块是本地存储的。存放模块所占用的空间不足挂齿,但是解决项目中模块之间的冲突所花去的时间至关重要。</p> <p>Java通常将项目中的外部依赖放在一个全局文件夹中。</p> <p>而Node和npm则将项目中的外部依赖存放在项目子文件夹 node_modules 中。通过此种方式,Node各个项目能够使用任何不同版本的模块而不会在项目之间引起冲突。</p> <p>要避免把任何东西安装在一个全局的位置,当然 node-static 或者 http-server (本地开发用Web服务器、静态内容)除外。甚至像WebPack这类工具也需要安装进本地的 node_modules 文件夹。</p> <p>正确的安装姿势:</p> <pre> <code class="language-javascript">npm i express</code></pre> <p>错误的安装姿势:</p> <pre> <code class="language-javascript">npm i -g express</code></pre> <h3>异步</h3> <p>Node是一个非阻塞输入/输出平台,可以帮助你更好地搭建高性能Web应用。(Java中同样有Play或者NIO这类的框架用以类比Node,然而这些框架并不如Node这样的平台底层,并且还更加复杂。)</p> <p>你需要将自己的编程思维从同步转换到异步,放弃从前那些用请求、数据库或文件读写来阻塞代码执行的方式。在Node中,开发者将充分挖掘回调(Callbacks)的力量(同时自由选择是否使用Promises、async/await等等)。</p> <pre> <code class="language-javascript">fs.writeFile('message.txt', 'Hello Node.js', (error) => { // 可能要耗费很长时间! if (error) console.error(error); console.log('保存完成!') }) // 还没有写完文件,下一个周期将回到这里</code></pre> <p>这种为非阻塞I/O提供支持的机制叫做事件轮询(Event Loop),是直接从Google Chrome V8引擎中拿来用的。欲知详情请参见这篇文章: <a href="/misc/goto?guid=4959736861544473208" rel="nofollow,noindex">how Event Loop works</a> 。</p> <h3>进一步学习</h3> <p>本文仅是简介,如果希望更多地了解Node以及其设计模式(包括async)和最佳实践,可以戳下面的链接:</p> <ul> <li><a href="/misc/goto?guid=4959736861621978065" rel="nofollow,noindex">你根本不了解Node</a> ,以及其 <a href="/misc/goto?guid=4959736861699376703" rel="nofollow,noindex">博客版</a></li> <li><a href="/misc/goto?guid=4959736861791193464" rel="nofollow,noindex">Node和MongoDB基金会免费在线课程</a></li> <li><a href="/misc/goto?guid=4959736861871973615" rel="nofollow,noindex">Node设计模式</a> ,以及其 <a href="/misc/goto?guid=4959736861958415949" rel="nofollow,noindex">电子书(列表的最后一个)</a></li> <li><a href="/misc/goto?guid=4959736862035473906" rel="nofollow,noindex">理解Node.js事件轮询</a></li> </ul> <p> </p> <p>来自:http://www.cnblogs.com/hwding/p/6386054.html</p> <p> </p>