采用2个空格缩进,而不是tab缩进。空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同。2个空格会让代码看起来紧凑、明快。
永远用var声明变量,不加var时会将其变为全局变量,这样可能会意外污染上下文,或是被意外污染。在ECMAScript5的scrict模式下,未声明的变量将会直接抛出ReferenceError异常。
需要说明的是,每行声明都应该带上var,而不是只有一个var,示例代码如下;
1 var assert = require('assert');
2 var fork = require('child_process').fork;
3 var net = require('net');
4 var EventEmitter = require('events').EventEmitter;
错误的示例如下所示:
1 var assert = require('assert')
2 , fork = require('child_process').fork
3 , net = require('net')
4 , EventEmitter = require('events').EventEmitter;
在操作符前后需要加空格,比如 +、-、*、%、=等操作符前后都应该存在一个空格,示例如下:
1 var foo = 'bar' + baz;
错误的示例如下所示:
1 var foo='bar'+baz;
此外,在小括号的前后应该存在空格,如:
1 if (true) {
2 // some code
3 }
错误的示例如下所示:
1 if(true){
2 // some code
3 }
由于双引号在别的场景下使用较多,在Node中使用字符串时尽量使用单引号,这样无需转义,如:
1 var html = '<a href="http://cnodejs.org">CNode</a>';
而在JSON中,严格的规范是要求字符串用双引号,内容中出现双引号时,需要转义。
一般情况下,大括号无需另起一行,如
1 if (true) {
2 // some code
3 }
错误的示例如下所示:
1 if (true)
2 {
3 // some code
4 }
逗号用于变量声明的分割或是元素的分割。如果逗号不在行结尾,前面需要一个空格。此外逗号不允许出现在行首,比如:
var foo = 'hello', bar = 'world'; // 或是 var hello = { foo:
'hello', bar: 'world' }; // 或是 var world = ['hello', 'world'];
错误的示例如下所示:
1 var foo = 'hello'
2 , bar = 'world';
3 // 或是
4 var hello = {foo: 'hello'
5 , bar: 'world'
6 };
7 // 或是
8 var world = [
9 'hello'
10 , 'world'
11 ];
给表达式结尾加根号。尽管Javascript编译器会自动给行尾添加分号,但还是会带来一些误解,示例如下:
1 function add() {
2 var a = 1, b = 2
3 return
4 a + b
5 }
将会得到undefined的返回值。因为自动加入分号会变成如下的样式:
1 function add() {
2 var a = 1, b = 2;
3 return;
4 a + b;
5 }
后续的a + b将不会执行。而如下的代码:
x = y
(function () {
}())
// 执行时会得到
x = y(function () {}())
由于自动添加分号可能会带来未预期的结果,所以添加上分号有助于避免误会。
在编码过程中,命名是重头戏。好的命名可以令代码赏心悦目,带来愉悦的阅读享受,令代码具有良好的可维护性。命令的主要范畴有变量、常量、方法、类、文件、包等。
变量名都采用小驼峰式命名,即除了第一个单词的首字母不大写外,每个单词的首字母都大写,词与词之间没有任何特殊符号,如:
1 var adminUser = {};
错误的示例如下:
1 var admin_user = {};
方法命名与变量命名一样,采用小驼峰式命名。与变量不同的是,方法名尽量采用动词或判断行词汇,如:
1 var getUser = function () {};
2 var isAdmin = function () {};
3 User.prototype.getInfo = function () {};
错误的示例如下:
1 var get_user = function () {};
2 var is_admin = function () {};
3 User.prototype.get_info = function () {};
类名采用大驼峰式命名,即所有单词的首字母都大写,如:
1 function User(){
2 }
作为常量时,单词的所有字母都大写,并用下划线分割,如:
1 var PINK_COLOR = "pink";
命名文件时,请尽量采用下划线分割单词,比如child_process.js和string.decode.js。如果你不想将文件暴露给其他用户,可以约定以下划线开头,如_linklist.js
如果你有贡献模块并将其打包发布到npm上。在包名中,尽量不要包含js或node的字样,它是重复的。包名应当适当短且有意义的,如:
1 var express = require('express');
在比较操作中,如果是无法容忍的场景,请尽量使用 === 代替 ==,否则你会遇到下面这河阳不符合逻辑的结果:
1 '0' == 0; // true
2 '' == 0 // true
3 '0' === '' // false
此外,当判断容忍假值时,可以无需使用 === 或 ==。在下面的代码中,当foo是0、undefined、null、false、‘ ’ 时,都会进入分支:
1 if (!foo) {
2 // some code
3 }
请尽量使用{}、[]代替new Object()、new Array(),不要使用string、bool、number对象类型,即不要使用new String、new Boolean 和 new Number。
在JavaScript中,需要注意一个关键字和一个方法,它们是with和eval(),容易引起作用域混乱。
1. 慎用with
示例代码如下:
1 with (obj) {
2 foo = bar;
3 }
它的结果有可能是如下四种之一:obj.foo = obj.bar; 、obj.foo = bar;、 foo = bar;、 foo = obj.bar;,这些结果取决于它的作用域。如果作用域链上没有导致冲突的变量存在,使用它则是安全的。但在多人合作的项目中,这并不能保证,所以要慎用with。
2. 慎用eval
在JavaScript中,数组其实也是独享,但是两者在使用时有些细节需要注意。
1.字面量格式
创建对象或者数组时,注意在结尾用逗号分隔。如果分行,一行只能一个元素,示例代码如下:
1 var foo = ['hello', 'world'];
2 var bar = {
3 hello: 'world',
4 pretty: 'code'
5 };
错误示例如下所示:
1 var foo = ['hello',
2 'world'];
3 var bar = {
4 hello: 'world', pretty: 'code'
5 };
2.for in 循环
使用for in循环时,请对对象使用,不要对数组使用,示例代码如下:
1 var foo = [];
2 foo[100] = 100;
3 for (var i in foo) {
4 console.log(i);
5 }
6 for (var i = 0; i < foo.length; i++) {
7 console.log(i);
8 }
在上述代码中,第一个循环只打印一次,而第二个循环则打印0~100,这并不满足预期的值。
3.不要把数组当做对象使用
尽管在JavaScript内部实现中可以把数组当做对象来使用,如下所示:
1 var foo = [1, 2, 3];
2 foo['hello'] = 'world';
3 这在for in迭代时,会得到所有值
4 for (var i in foo) {
5 console.log(foo[i]);
6 }
7 也许你只是想得到hellow而已。
在Node中,异步使用非常广泛并且在实践过程中形成了一些约定,这是以往不曾在意的点。
1.异步回调函数的第一个参数应该是错误指示
并不是所有的回调函数都需要将第一个参数设计为错误对象,但是一旦涉及异步,将会导致try catch无法捕获到异步回调期的异常。将第一个参数设计为错误对象,告知调用方是一个不错的约定。示例代码如下。
1 function(err, data){
2 };
这个约定被很多流程控制库所采用。遵循这个约定,可以享受社区流程控制库带来的业务编写遍历。
2.执行传入的回调函数
在异步方法中一旦有回调函数传入,就一定要执行它,且不能多次执行。如果不执行,可能造成调用一直等待不结束,多次执行也可能会造成未预期的结果。
关于如何在JavaScript中实现继承,有各种各样的方式,但在Node中我们只推荐一种,那就是类继承的方式。另外,在Node中,如果要将一个类作为一个模块,就需要在意它的导出方式。
1.类继承
一般情况下,我们采用Node推荐的类继承方式,示例代码如下:
1 function Socket(options) {
2 // ...
3 stream.Stream.call(this);
4 // ...
5 }
6 util.inherits(Socket, stream.Stream);
1 module.exprots = Class;
而不是通过
1 exports = Class;
私有方法无需因为测试等原因导出给外部,所以无需挂载。
一般情况下,我们会对每个方法编写注释,这里采用dox的推荐注释,示例如下:
1 /**
2 * Queries some records
3 * Examples:
4 * ```
5 * query('SELECT * FROM table', function (err, data) {
6 * // some code
7 * });
8 * ```
9 * @param {String} sql Queries
10 * @param {Function} callback Callback
11 */
12 exports.query = function (sql, callback) {
13 // ...
14 };
关于 Node.js 里 ES6 Modules 的一次更新说明,总结来说:CommonJS 与 ES6 Modules 之间的关键不同在于代码什么时候知道一个模块的结构和使用它。
在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外
首先你需要生成https证书,可以去付费的网站购买或者找一些免费的网站,可能会是key或者crt或者pem结尾的。不同格式之间可以通过OpenSSL转换
nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。
3G的大文件分1500个2M二进度文件,通post方法发送给node服务,服务器全部接收到文件后,进组装生成你上文件。
JavaScript比C的开发门槛要低,尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,JavaScript在浏览器中有广泛的事件驱动方面的应用,考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。
node.js的第一个基本论点是I / O的性能消耗是很昂贵。因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响
在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?
我们经常跟Node.js打交道,即使你是一名前端开发人员 -- npm脚本,webpack配置,gulp任务,程序打包 或 运行测试等。即使你真的不需要深入理解这些任务,但有时候你会感到困惑,会因为缺少Node.js的一些核心概念而以非常奇怪的方式来编码。
运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!