两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 |
public:it:nodejs [2018/02/28 13:48] – 外部编辑 127.0.0.1 | public:it:nodejs [2025/03/28 11:11] (当前版本) – [NodeJS/Javascript] oakfire |
---|
====== NodeJS/Javascript ====== | ====== NodeJS/Javascript ====== |
<WRAP center round tip 60%> | <WRAP center tip 60%> |
News: | News: |
* [[https://nodejs.org/en/blog/release/v6.0.0/|node 6.0]] | |
* [[https://cnodejs.org/topic/55efcc524b70f72113ff4f3b|nodejs 4.0]] | * [[https://nodejs.org/en/blog/release|NodeJS releases note]] |
* [[http://blog.nodejs.org/2015/02/06/node-v0-12-0-stable/|node-v0-12-0-stable]] | * [[http://blog.nodejs.org/2015/02/06/node-v0-12-0-stable/|node-v0-12-0-stable]] |
* [[https://github.com/joyent/node/wiki/API-changes-between-v0.10-and-v0.12|API-changes-between-v0.10-and-v0.12]] | * [[https://github.com/joyent/node/wiki/API-changes-between-v0.10-and-v0.12|API-changes-between-v0.10-and-v0.12]] |
</WRAP> | </WRAP> |
| |
<WRAP center round tip 60%> | <WRAP center tip 60%> |
[[https://github.com/creationix/nvm|Nodejs版本选择与快速安装利器NVM,适用开发环境]] | [[https://github.com/creationix/nvm|Nodejs版本选择与快速安装利器NVM,适用开发环境]] |
</WRAP> | </WRAP> |
* [[http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html|深入理解JavaScript系列]] | * [[http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html|深入理解JavaScript系列]] |
* [[http://www.infoq.com/cn/articles/generator-and-asynchronous-programming|Generator and asynchronous programming]] | * [[http://www.infoq.com/cn/articles/generator-and-asynchronous-programming|Generator and asynchronous programming]] |
| * [[Typescript]] |
<WRAP center round important 80%> | <WRAP center important 80%> |
* Nodejs v4.0.0 之后的版本需要 gcc 4.7版本以上来进行 addon 编译. GCC 4.7 or newer is required due to V8 using the template alias feature in C++. | * Nodejs v4.0.0 之后的版本需要 gcc 4.7版本以上来进行 addon 编译. GCC 4.7 or newer is required due to V8 using the template alias feature in C++. |
</WRAP> | </WRAP> |
* {{:public:it:speakerdeck-_memory_management_masterclass_devtools_2_.pdf|memory_management.pdf}} | * {{:public:it:speakerdeck-_memory_management_masterclass_devtools_2_.pdf|memory_management.pdf}} |
* [[http://huang-jerryc.com/2016/04/14/NodeJS%E4%B8%AD%E8%A2%AB%E5%BF%BD%E7%95%A5%E7%9A%84%E5%86%85%E5%AD%98/|NodeJS 内存]] | * [[http://huang-jerryc.com/2016/04/14/NodeJS%E4%B8%AD%E8%A2%AB%E5%BF%BD%E7%95%A5%E7%9A%84%E5%86%85%E5%AD%98/|NodeJS 内存]] |
| * [[https://blog.appsignal.com/2022/09/28/minimize-heap-allocations-in-nodejs.html|Minimize heap allocations in nodejs]] |
| |
| |
===== 3. Packages ===== | ===== 3. Packages ===== |
* [[https://github.com/sindresorhus/awesome-nodejs|awesome-nodejs]] <wrap em>这里可以分类查找你想要的库!</wrap> | * [[https://github.com/sindresorhus/awesome-nodejs|awesome-nodejs]] <wrap em>这里可以分类查找你想要的库!</wrap> |
==== 3.1 Modules ==== | ==== ›› Modules ==== |
* commonjs [[http://wiki.commonjs.org/wiki/Modules/1.0|Modules/1.0]] | * commonjs [[http://wiki.commonjs.org/wiki/Modules/1.0|Modules/1.0]] |
* [[http://nodejs.org/api/modules.html| modules doc]] **modules cycles 注意关于模块互相包含的处理机制** | * [[http://nodejs.org/api/modules.html| modules doc]] **modules cycles 注意关于模块互相包含的处理机制** |
==== 3.2 npm or yarn==== | ==== ›› npm or yarn==== |
* [[https://www.npmjs.com/|npm]] | * [[https://www.npmjs.com/|npm]] |
* [[https://docs.npmjs.com/files/package.json|package.json]] | * [[https://docs.npmjs.com/files/package.json|package.json]] |
* cnpm: npm client for npm.taobao.org ''$ npm install cnpm -g --registry=http://r.cnpmjs.org'' | * npm 使用国内淘宝源<code bash> |
| npm config set registry https://registry.npmmirror.com |
| # 配置后可通过下面方式来验证是否成功 |
| npm config get registry |
| npm get registry |
| npm info webpack |
| # 恢复 |
| npm config rm registry |
| </code> |
* [[https://yarnpkg.com/zh-Hans/|yarn]]: 更快更安全 | * [[https://yarnpkg.com/zh-Hans/|yarn]]: 更快更安全 |
==== 3.3 pm2 ==== | * [[https://pnpm.io/motivation|pnpm]]: 可节省硬盘空间 |
| ==== ›› pm2 ==== |
* [[https://github.com/Unitech/pm2|pm2]] nodejs进程管理工具, 可 | * [[https://github.com/Unitech/pm2|pm2]] nodejs进程管理工具, 可 |
* 进程运行状态监测,进程重启 | * 进程运行状态监测,进程重启 |
* 超过指定内存则重启 | * 超过指定内存则重启 |
* 文件改动则重启 | * 文件改动则重启 |
==== 3.4 async ==== | ==== ›› rxjs ==== |
| * [[https://github.com/ReactiveX/rxjs|github repo]] |
| * [[https://rxjs.dev/guide/overview|overview]] |
| * [[https://rxjs.dev/guide/observable|observable]] 这个要熟读并理解 |
| ==== ›› async ==== |
* [[https://github.com/caolan/async|async]] | * [[https://github.com/caolan/async|async]] |
* [[https://github.com/bsspirit/async_demo|async demo]] | * [[https://github.com/bsspirit/async_demo|async demo]] |
* [[http://zhangqi.im/webdevelopment/nodejsasyncone.html|部分介绍]] | * [[http://zhangqi.im/webdevelopment/nodejsasyncone.html|部分介绍]] |
* [[http://blog.fens.me/nodejs-async/|全面一点的]] | * [[http://blog.fens.me/nodejs-async/|全面一点的]] |
==== 3.5 promise ==== | ==== ›› promise ==== |
* [[http://www.thinkingincrowd.me/2013/11/13/callbacks-are-imperative/|Callbacks are imperative]] (async)回调风格是显式的控制处理流程来把很多值组织在一起,而 promises 是显式表达出值的关系来把控制流的各个组件连接在一起。回调是指令式的,promises 是函数式的 | * [[http://www.thinkingincrowd.me/2013/11/13/callbacks-are-imperative/|Callbacks are imperative]] (async)回调风格是显式的控制处理流程来把很多值组织在一起,而 promises 是显式表达出值的关系来把控制流的各个组件连接在一起。回调是指令式的,promises 是函数式的 |
* [[https://jysperm.me/2016/10/nodejs-error-handling/|引自这篇文章:]]如果有异常没有捕捉到怎么样?如果有一个异常一直被传递到最顶层调用栈还没有被捕捉,那么就会导致进程的崩溃退出,不过我们还有两个终极捕捉手段:<code javascript> | * [[https://jysperm.me/2016/10/nodejs-error-handling/|引自这篇文章:]]如果有异常没有捕捉到怎么样?如果有一个异常一直被传递到最顶层调用栈还没有被捕捉,那么就会导致进程的崩溃退出,不过我们还有两个终极捕捉手段:<code javascript> |
console.error(err); | console.error(err); |
}); | }); |
//uncaughtException 事件可以捕捉到那些已经被抛出到最顶层调用栈的异常,一旦添加了这个监听器, | </code> ''uncaughtException'' 事件可以捕捉到那些已经被抛出到最顶层调用栈的异常,一旦添加了这个监听器,这些异常便不再会导致进程退出。实际上有一些比较激进的人士认为程序一旦出现事先没有预料到的错误,就应该立刻崩溃,以免造成进一步的不可控状态,也为了提起开发人员足够的重视。但我从比较务实的角度建议还是不要这样做,尤其是服务器端程序,一个进程崩溃重启可能需要一分钟左右的时间,这段时间会造成服务的处理能力下降,也会造成一部分连接没有被正确地处理完成,这个后果很可能是更加严重的。但我们应当将在这个事件中捕捉到的错误视作非常严重的错误,因为在此时已经丢失了和这个错误有关的全部上下文,必然无法妥善地处理这个错误,唯一能做的就是打印一条日志。<code javascript> |
//这些异常便不再会导致进程退出。实际上有一些比较激进的人士认为程序一旦出现事先没有预料到的错误, | |
//就应该立刻崩溃,以免造成进一步的不可控状态,也为了提起开发人员足够的重视。但我从比较务实的角度 | |
//建议还是不要这样做,尤其是服务器端程序,一个进程崩溃重启可能需要一分钟左右的时间,这段时间会造成 | |
//服务的处理能力下降,也会造成一部分连接没有被正确地处理完成,这个后果很可能是更加严重的。 | |
//但我们应当将在这个事件中捕捉到的错误视作非常严重的错误,因为在此时已经丢失了和这个错误有关的 | |
//全部上下文,必然无法妥善地处理这个错误,唯一能做的就是打印一条日志。 | |
process.on('unhandledRejection', (reason, p) => { | process.on('unhandledRejection', (reason, p) => { |
console.error(reason, p); | console.error(reason, p); |
}); | });</code>''unhandledRejection'' 事件可以捕捉到那些被 reject 但没有被添加 .catch 回调的 Promise, 通常是因为你忘记为一个返回 Promise 的函数添加 return。因为 Promise 本来就是对异步错误的一种封装,所以实际使用中偶尔也会出现 Promise 先被 reject, 而后再用 .catch 添加错误处理的情况,所以这个事件实际上偶尔会有误报。 |
//unhandledRejection 事件可以捕捉到那些被 reject 但没有被添加 .catch 回调的 Promise, | |
//通常是因为你忘记为一个返回 Promise 的函数添加 return。因为 Promise 本来就是对异步错误的一种封装, | |
//所以实际使用中偶尔也会出现 Promise 先被 reject, 而后再用 .catch 添加错误处理的情况, | |
//所以这个事件实际上偶尔会有误报。 | |
| |
</code> | |
* 对数组或对象或map进行顺序的异步任务时,可以这样<code javascript> | * 对数组或对象或map进行顺序的异步任务时,可以这样<code javascript> |
//要得到一个then then then的promise链,先定义一个已经resolve了的promise,然后依次往后then… | //要得到一个then then then的promise链,先定义一个已经resolve了的promise,然后依次往后then… |
}); | }); |
</code> | </code> |
==== 3.6 express ==== | ==== ›› express ==== |
* 4.0 开始 express 废弃 connect, 默认的文件上传插件''multer''需要手动引入 | * 4.0 开始 express 废弃 connect, 默认的文件上传插件''multer''需要手动引入 |
==== 3.7 winston ==== | ==== ›› winston ==== |
* [[https://github.com/flatiron/winston | Homepage]] | * [[https://github.com/flatiron/winston | Homepage]] |
* Console 默认不以json格式记录, File默认以json格式记录, 可以用''json:true/false''来修改 | * Console 默认不以json格式记录, File默认以json格式记录, 可以用''json:true/false''来修改 |
* ''prettyPrint'' 会把object或json展开成多行, 利于肉眼观察不利于grep分析 | * ''prettyPrint'' 会把object或json展开成多行, 利于肉眼观察不利于grep分析 |
==== 3.8 moment ==== | ==== ›› moment ==== |
* <wrap em>坑!</wrap>moment如果使用object构造, 其中参数月份的值范围是0~11, 而其它构造方式是1~12; | * <wrap em>坑!</wrap>moment如果使用object构造, 其中参数月份的值范围是0~11, 而其它构造方式是1~12; |
==== 3.9 http-server ==== | * 改用 day.js |
| ==== ›› http-server ==== |
* 使用方便的静态http服务 ''sudo npm i http-server -g'' 安装, 之后使用''http-server''命令来启动静态网站. | * 使用方便的静态http服务 ''sudo npm i http-server -g'' 安装, 之后使用''http-server''命令来启动静态网站. |
==== 3.10 一些好用的库 ==== | ==== ›› 一些好用的库 ==== |
* [[https://www.npmjs.com/package/shelljs|shelljs]] | * [[https://www.npmjs.com/package/shelljs|shelljs]] |
* [[https://www.npmjs.com/package/inquirer|inquirer]] 超好用的命令行界面库 | * [[https://www.npmjs.com/package/inquirer|inquirer]] 超好用的命令行界面库 |
* [[https://www.npmjs.com/package/figlet|figlet]] ascii字符图形 | * [[https://www.npmjs.com/package/figlet|figlet]] ascii字符图形 |
| |
==== 3.11 tips ==== | ==== ›› tips ==== |
* node-gyp 提示错误''/home/you/.node-gyp/0.10.26/common.gypi not found'',原因可能是上一次失败引起,直接删除''.node-gyp''整个文件夹迫使其重新编译即可。 | * node-gyp 提示错误''/home/you/.node-gyp/0.10.26/common.gypi not found'',原因可能是上一次失败引起,直接删除''.node-gyp''整个文件夹迫使其重新编译即可。 |
* :!: node 从 0.12 版本开始, ''socket.remoteAddress'' 的 IP 显示格式就变成了 IPv6 格式, 比如IP ''10.11.13.3'' 变为 ''::ffff:10.11.13.3'' | * :!: node 从 0.12 版本开始, ''socket.remoteAddress'' 的 IP 显示格式就变成了 IPv6 格式, 比如IP ''10.11.13.3'' 变为 ''::ffff:10.11.13.3'' |