node不是一门语言,是基于ChromeV8引擎的 runtime(运行时),是 JS 在后端运行的一个环境,且不包括 JS 全集node
咱们常常听到node有以下优势:web
理解如下关键词:npm
图一:Tomcat多线程处理web任务 后端
图二:Node单线程处理web任务 浏览器
可见 node 在web应用中的 I/O (读写操做、输入输出、请求响应) 操做是很高效的。 Node 适合处理 I/O 密集型应用,而非 CPU 密集型应用bash
process多线程
console.log(process);
复制代码
mac设置NODE_ENV闭包
> $ export NODE_ENV=dev
复制代码
node 的每个文件都是一个模块,是 node 模块化的一个划分规则并发
console.log(this)
输出结果是什么?var
声明变量 a
,那么这个 a
会在哪里?process.nextTick()
中的 this
setTimeout()
与 setImmediate()
中的 this
箭头函数 this 指向的是函数的父级做用域,因此在回调函数中尽可能使用 () => {}
异步
setTimeout(() => {
console.log(this);
// console.log(arguments);
}, 0)
复制代码
从上面的 arguments
例子中,咱们看到了 箭头函数的父做用域,也就是当前 node 模块是有 arguments
存在的。这是否是能够证实 node 模块本质就是一个闭包?(其实没有那么高深莫测哦~)
// try this
console.log(a);
复制代码
因此 node 模块化,一个模块内被传入
模块化有什么好处
node依赖的是 commonjs 规范
require
来引用,require()
能够写入代码逻辑,不用置顶exports
/module.exports
扩展:
第一个例子:node 模块没有输出
// 文件a
const a = 1;
const b = function() { console.log('this is file a'); }
// 文件b
const fileA = require('./a.js');
console.log(fileA);
复制代码
其实 node 模块其中真正的实现是酱紫:
(function(exports, require, module, __filename, __dirname) {
module.exports = exports = this = {};
/*------ our code -------*/
return module.exports;
})()
复制代码
既然了解了 node 模块输入输出究竟是怎么回事,name看下面这个例子
// 文件a
exports = 123;
// 文件b
const fileA = require('./a');
console.log(fileA);
复制代码
再看下面的一个问题:
上面咱们了解到了 node 模块化的本质,在咱们以往的编码经验中,咱们也知道,require()过来的代码对当即执行
// a文件
console.log('这里是a文件');
const func = () => {
console.log('这是a文件的函数');
}
module.exports = func;
// b文件
const fileA = require('./a');
fileA();
复制代码
那么再看下面的这个问题:
// a文件
console.log('这里是a文件');
const func = () => {
console.log('这是a文件的函数');
}
module.exports = func;
// b文件
require('./a');
require('./a');
require('./a');
复制代码
系列文章将按期更新,往期文章会按期优化