日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java程序员的NodeJS初识篇

發(fā)布時間:2025/4/9 javascript 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java程序员的NodeJS初识篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

摘要

作為一個一直用java來寫后端的程序員用NodeJS來寫后臺,實在不是很爽。這里記下這兩個月的NodeJS學習所遇之坑,與java轉(zhuǎn)NodeJS的同仁共勉。學習時間不長,若有理解錯誤,望指正。

一.JS基本

exports,module.exports

  • exports 就是module.exports的引用
  • 在module 被計算之前,會將module.exports的值賦給exports
  • 當module.exports賦值之后,再對exports改值,不會影響module.exports的值,而外部
    require module的時候,如果module.exports有定義,調(diào)用的是module.exports的值。
    eg1.
module.exports.hello = true; // Exported from require of module exports = { hello: false }; // Not exported, only available in the module

eg2.
module.js

module.exports = 'a'; exports.B = 'b';

call.js

var module = require('module'); console.log(module.B); //undefined
  • exports 就是傳統(tǒng)的module實例,可以exports 變量,也可以exports 方法,調(diào)用的時候都一樣,通過
    instance.xxx來調(diào)用

eg. module.js

exports.A = 'a' exports.add = function add(a, b){return a+b; }

call.js

var module = require('module'); module.A; module.add(xx,xx);
  • module.exports可以將module,exports成任何合法的js 類型,boolean,JSON,function都可以。
    從這點上說,就不能將javascript中的module類比成java中的類/實例。
module.exports = function (a, b) {return a + b; }

import 某個module的屬性

與直接import不同
import { test } from ‘xxx’
issue

class 與instance

js中并沒有class,一切皆為對象。面向?qū)ο蟮膶崿F(xiàn)是通過prototype來實現(xiàn)的。
例如一般在某個文件中調(diào)用某個js文件,就是在文件開始部分require,然后在文件中
各處引用。而這點與java不同,java是首先import,然后具體用的時候需要new 一個instance再使用

js中require 以后直接使用。不需要new instance。所以各處用的都是同一個instance。
如果想new一個object,創(chuàng)建新的instance,則需要使用原型。這樣每個new出來的對象就有對應的
原型方法了。
eg.
test.js

// 類似于構造函數(shù) function Test() {}Test.prototype.add = function (a,b) {return a+b; }; module.exports = Test;

call.js

require Test from 'test'; function sub(){ var test1 = new Test(); test1.add(); }

作用域

對于方法而言,js沒有類似于java的那么強的域控制public,protected,private
就分內(nèi)部與外部,只在函數(shù)內(nèi)部使用的就不要export出去。

二.異步回調(diào)

js 代碼寫起來和java代碼最大的不同就是回調(diào)了。
java代碼基本消滅了隨意跳轉(zhuǎn)的goto。閱讀代碼塊或者寫代碼塊時基本就是按照從上
到下的順序即可。因為java代碼都是同步執(zhí)行的。而JS很多都是異步執(zhí)行,所以如果你想
你的邏輯是順序執(zhí)行的話,必須等待異步執(zhí)行返回結(jié)果后,再去執(zhí)行下面的代碼。因為js
方法大多是非阻塞。

—-2017.3.14更新———-
其實這代表了兩種不同的并發(fā)處理方式,一種是java的,基于線程的并發(fā),一個task一個線程。
寫起來也是順序執(zhí)行的。但是task增多,多個線程之間切換代價昂貴,可能會導致吞吐量下降。

而nodejs,則是基于事件的并發(fā),單線程處理事件,每個并發(fā)流實現(xiàn)為一個有限狀態(tài)機。所以需要回調(diào)。應用直接控制。但是當并發(fā)負載增加的時候,吞吐量飽和響應時間線性增長

還有一種的話就是之前介紹的cassandra實現(xiàn)的SEDA模型

eg.實現(xiàn)查mongo數(shù)據(jù)庫
java code

MongoClient client = new MongoClient(url); Collection coll = client.getCollection('test'); ResultSet<String> rs = coll.find({});

而js則是

MongoClient.connect(url, function(err, db) {//回調(diào),等待連接成功,才能執(zhí)行下一步。if (err) {callback(err);}var coll = db.collection('test');coll.find({name:"mike"}).toArray(function(err, results) {console.log(results);db.close();}); });

三.內(nèi)存溢出

NodeJs使用google V8來管理內(nèi)存,V8會將js代碼編譯為本地代碼,然后執(zhí)行它。
V8會按需進行內(nèi)存的分配和釋放。和JVM差不多了。將內(nèi)存區(qū)域分區(qū),

  • 代碼區(qū)域

  • 值類型的數(shù)據(jù),內(nèi)部變量,控制程序的指針。

  • 保存引用類型(對象,字符串,閉包)

在做mongodb數(shù)據(jù)大量插入的時候遇到過一次內(nèi)存溢出的問題,所以需要分析溢出原因,
java中一般是dump處文件,然后用其他工具分析對象。NodeJs也類似。

var heapdump = require('heapdump'); heapdump.writeSnapshot();

然后在chrome中的Profile工具來分析溢出對象。但是實際中此效果不好,原因是chrome的內(nèi)存不夠大(可能需要調(diào)整瀏覽器內(nèi)存大小),另外結(jié)果不是很直觀。還可以使用util包中輸出內(nèi)存占用

var util = require('util'); console.log(util.inspect(process.memoryUsage()));

內(nèi)存溢出原因:
在上面提到過在js中基本都是回調(diào)函數(shù),mongo插入同樣也是。使用mongo.insertMany(array)來批量插入提高性能。同時充分利用異步特點,使用async.each來控制,模擬多線程并發(fā)。但是這邊就存在一個問題,有經(jīng)驗的老手就能看出來了,插入的數(shù)據(jù)array占用的內(nèi)存什么時候釋放。mongo.insertMany調(diào)用開始,到真正插入到db中需要一定時間。插入上千萬條數(shù)據(jù)的,內(nèi)存回收不及時的話肯定是要溢出的。所以要加一層并發(fā)控制,比如說以10萬條數(shù)據(jù)為內(nèi)層并發(fā),這些數(shù)據(jù)的插入是并發(fā)操作的,無序的,等這一批數(shù)據(jù)插入成功后,再進行下一批數(shù)據(jù)插入,釋放內(nèi)存。

四.打包

java中依賴其他包,使用jar包。build工具可以用maven,gradle。
nodejs中依賴其他包,使用module.使用npm來構建
在package.json中的 files屬性中定義要打包的文件
“files”: [
“src/publish”,
],

在main屬性中定義main文件
“main”: “src/index.js”,

使用npm publish命令到repository。如果是本地的調(diào)用,使用npm pack 打包
在其他project中使用 npm install -s $PATH/publish-service-0.0.1.tgz添加引用

五.參考

http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
https://cnodejs.org/topic/55accdeab4ab1d7d02bf0d8c
http://wwsun.github.io/posts/understanding-nodejs-gc.html

轉(zhuǎn)載于:https://www.cnblogs.com/stoneFang/p/6715270.html

總結(jié)

以上是生活随笔為你收集整理的java程序员的NodeJS初识篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。