前言

今天上推特看见这篇文章,点进去发现是新货。

正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解。

才疏学浅,如有不妥之处请指正。

原文链接:Node for Java Developers

这个Node University貌似也提供一些免费的在线课程。

正文



在我举办的Node.js研讨会、开设的课程以及编撰的书之中(尤其是我在线教学的时候),最大的受众便是Java开发者。因为在很久以前,作为一位专业的软件开发人员,你必须得知晓Java这门语言。然而现在情况大不相同,Node.js以及其他语言诸如Go、Elixir、Python、Clojure的蓬勃发展,表明工程师们更倾向选择多语言环境作为他们的开发工具。

Node.js,一种跑在服务器上的JavaScript运行时,设置起来既简单又快速,因此在从前属于Java的服务器领域中广受好评。这篇文章将用以下几个小节,帮助Java开发者向Node转型:

  • 给Java开发者看的Node术语
  • 类型
  • 模块
  • 异步

    给Java开发者看的Node术语

    既然你是一名Java开发者,那么就请允许我用你熟悉的Java名称和概念来介绍Node术语:

  • console.log('Hello') 相当于System.out.println("Hello");
  • npm相当于Apache Maven(但是npm集成捆绑了Node)
  • npmjs.org相当于mvnrepository.com
  • Mongoose/Sequelize/Juggler/Waterline/Bookshelf相当于Hibernate: Persistence Object Relation/Document Mapper framework(都是对象关系持久化/文档映射框架)
  • Loopback(Node.js API框架)相当于Spring MVC(都是Web应用的MVC框架)
  • Express middleware(Express中间件)相当于Servlet filters(都是Web应用的代码重用)
  • Atom/VS Code相当于Eclipse(都是写代码的工具)
  • Webstorm相当于IntelliJ IDEA(都是出自Jet Brains的IDE)
  • Webpack/Grunt/Gulp相当于Ant/SBT/Gradle(都是构建工具,Node需要被解释器翻译而非编译成二进制码,这种翻译通常被称为Transpilation)
  • Node非阻塞I/O相当于NIO
  • MongoDB/PostgreSQL相当于Oracle database
  • V8相当于JVM
  • node debug相当于jdb(都是命令行调试器)
  • Node Inspector相当于JVE(都是可视化调试器)
  • Node基金会相当于Oracle公司(然而Node基金会是非盈利的)
  • nvm/n/nave相当于jenv(都用于版本管理)
  • Mocha相当于Junit
  • Winston相当于Log4J

只要把以上的推论熟记于心,就能够加速Node学习。

这其中有几条的说法比较牵强,比如MongoDB属于NoSQL而Oracle几乎可以说是一个SQL数据库。

既然已经介绍了一些Node基本术语,接下来我们将面对一些常见问题,在我的直播课程中经常有人提出这一类问题,即Node/JavaScript与Java的区别。

类型

在Node/JavaScript中,类型非常宽松。每一个变量都能够存储任何类型的数据,也就是说,是存储在变量中的数据决定了这个变量的类型,而非变量本身。例如:

let str = 10
console.log(typeof str) // -> number
str = '现在这是个字符串了'
console.log(typeof str) // -> string

同样在函数的声明中,不需要为函数参数指定类型。例如,参数page可以是一个数字类型也可以是一个函数,因为它是一个可选的参数:

const f = function (limit, page, callback) {
  if (typeof page == 'function' && !callback) {
    callback = page
    page = 1
  }
  // ...
  return callback()
}
f(10, ()=>{}) // 可行
f(10, 2, ()=>{}) // 同样可行

模块

Node模块是本地存储的。存放模块所占用的空间不足挂齿,但是解决项目中模块之间的冲突所花去的时间至关重要。

Java通常将项目中的外部依赖放在一个全局文件夹中。

而Node和npm则将项目中的外部依赖存放在项目子文件夹node_modules中。通过此种方式,Node各个项目能够使用任何不同版本的模块而不会在项目之间引起冲突。

要避免把任何东西安装在一个全局的位置,当然node-static或者http-server(本地开发用Web服务器、静态内容)除外。甚至像WebPack这类工具也需要安装进本地的node_modules文件夹。

正确的安装姿势:

npm i express

错误的安装姿势:

npm i -g express

异步

Node是一个非阻塞输入/输出平台,可以帮助你更好地搭建高性能Web应用。(Java中同样有Play或者NIO这类的框架用以类比Node,然而这些框架并不如Node这样的平台底层,并且还更加复杂。)

你需要将自己的编程思维从同步转换到异步,放弃从前那些用请求、数据库或文件读写来阻塞代码执行的方式。在Node中,开发者将充分挖掘回调(Callbacks)的力量(同时自由选择是否使用Promises、async/await等等)。

fs.writeFile('message.txt', 'Hello Node.js', (error) => { // 可能要耗费很长时间!
  if (error) console.error(error);
  console.log('保存完成!')
})
// 还没有写完文件,下一个周期将回到这里

这种为非阻塞I/O提供支持的机制叫做事件轮询(Event Loop),是直接从Google Chrome V8引擎中拿来用的。欲知详情请参见这篇文章:how Event Loop works

进一步学习

本文仅是简介,如果希望更多地了解Node以及其设计模式(包括async)和最佳实践,可以戳下面的链接:

写给Java开发者的Node.JS简介的更多相关文章

  1. 《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  2. 01 Node.js简介, 安装&配置

    Node.js 简介 Node.js 是什么 Node.js 有着强大而灵活的包管理器(node package manager,npm) 目前, 已经有强大第三方工具模块, 例如数据库连接, 网站开 ...

  3. [转载]PayPal为什么从Java迁移到Node.js,性能提高一倍,文件代码减少44%

    http://ourjs.com/detail/52a914f0127c763203000008 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 ...

  4. PayPal为什么从Java迁移到Node.js 性能提高一倍 文件代码减少44%

    大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal  解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2 ...

  5. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  6. PayPal为什么从Java迁移到Node.js

    前言 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal  解释了为什么从Java迁移出来的原因: 开发效率提高一 ...

  7. node.js入门系列(一)--Node.js简介

    什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一 ...

  8. node.js 简介

    简介:     Node,是一个可以让 JavaScript 运行在服务器端的平台.它可以让 JavaScript 脱离浏览器的束缚运行在一般的服务器环境下     Node.js 是一个为实时Web ...

  9. 【个人笔记】《知了堂》node.js简介及创建应用

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架.Node.js自带运行时环境可在Javascript脚本的基础上可以解释和执行 ...

随机推荐

  1. window.location获取URL中各部分

    博客分类: JAVASCRIPT JavaScriptASP.netSchemeASP网络协议  URL即:统一资源定位符 (Uniform Resource Locator, URL) 完整的URL ...

  2. html中的图片、css、js等路径加载问题

    网页文件的存取路径有3种:物理路径.绝对路径和相对路径. 物理路径就是你的文件放在主机上的具体位置,例如:D:\\image\\1.jpg 这种格式,该方法可以很快确定出你的文件,但是在网页显示路径基 ...

  3. OSD(On Screen Display )技术(转)

    源:OSD(On Screen Display )技术 OSD 是 On Screen Display 的缩写,是应用在 CRT/LCD 显示器上,在显示器的荧幕中产生一些特殊的 字形或图形,让使用者 ...

  4. css3动画-animation

    animation驱使一组css style变化到另外一组css style,它可以定义keyframes的集合,指定style的开始和结束状态,它是transition的增强. 配置animatio ...

  5. iOS开发使用MJRefresh进行刷新

    1.将MJRefresh下载后,拖进项目 MJRefresh地址: https://github.com/CoderMJLee/MJRefresh 2.添加头文件 #import "MJRe ...

  6. NSDate常用代码范例

    NSDate常用代码范例 NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建N ...

  7. 关于学习方法的借鉴和有关C语言学习的调查

    专长的高超技能获取的成功经验 在游戏方面,我相对于大多数人来说可能更为出色.首先是我投入了大量的时间进行游戏:其次,我几乎每天都会看一会教学视频来模仿:最后应该还是跟个人的天赋有点关系. 如果把这个类 ...

  8. linux 5个查找命令

    1. find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...

  9. 滚动视图(ScrollView)的功能与用法

    滚动视图ScrollView由FrameLayout派生而出,它就是一个用于为普通组件添加滚动条的组件.ScrollView里最多只能包含一个组件,而ScrollVew的作用就是为该组件添加垂直滚动条 ...

  10. 腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

    腾讯面试题:10G 个整数,乱序排列,要求找出中位数.内存限制为 2G. 题目和基本思路都来源网上,本人加以整理. 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只 ...