七天学不会nodejs --- node 入门

什么是node

node不是一门语言,是基于ChromeV8引擎的 runtime(运行时),是 JS 在后端运行的一个环境,且不包括 JS 全集node

node与js

为何使用node

咱们常常听到node有以下优势:web

  • 天生优秀的高并发处理能力
  • 非阻塞(异步、callback)
  • 强大的 I/O 处理能力
  • 模块化(CommonJs)

理解如下关键词:npm

  1. 什么是同步异步
  2. 是什么是异步 I/O
  3. 什么是阻塞与非阻塞
  4. 什么是事件循环与事件驱动
  5. 什么是单线程
  6. 什么是进程
  7. 什么是子进程(扩展:启动子进程、进程通讯)

初步了解进程

浏览器原理

浏览器进程

  • 浏览器是多进程的
  • 进程拥有多个线程,如上图的 UI 线程
  • UI 线程与 JS 线程是互斥的
  • 浏览器渲染引擎又叫浏览器内核
  • Chrome插件对应一个进程(第三方插件进程)
  • GPU提升渲染效率,对应GPU进程

I/O 密集型(对比JAVA)

图一:Tomcat多线程处理web任务 后端

Tomcat多线程

图二:Node单线程处理web任务 浏览器

Node单线程

可见 node 在web应用中的 I/O (读写操做、输入输出、请求响应) 操做是很高效的。 Node 适合处理 I/O 密集型应用,而非 CPU 密集型应用bash

node 开发三大件

  • npm 包管理器(你们都懂)
  • nvm node版本管理工具(你们也懂)
  • nrm node npm源管理工具(你们也懂)

全局变量

  • console
  • process 经常使用于设置环境变量
  • Buffer
  • ……

process多线程

console.log(process);
复制代码

mac设置NODE_ENV闭包

> $ export NODE_ENV=dev
复制代码

node的模块化

node 的每个文件都是一个模块,是 node 模块化的一个划分规则并发

  • 问题
    • 在 node 文件中 console.log(this) 输出结果是什么?
    • 若是不用 var 声明变量 a,那么这个 a 会在哪里?
  • 几个须要注意的地方
    • 异步微任务,process.nextTick() 中的 this
    • setTimeout()setImmediate() 中的 this
    • talk is cheap, show me the code

箭头函数 this 指向的是函数的父级做用域,因此在回调函数中尽可能使用 () => {}异步

setTimeout(() => {
    console.log(this);
    // console.log(arguments);
}, 0)
复制代码

从上面的 arguments 例子中,咱们看到了 箭头函数的父做用域,也就是当前 node 模块是有 arguments 存在的。这是否是能够证实 node 模块本质就是一个闭包?(其实没有那么高深莫测哦~)

// try this
console.log(a);
复制代码

因此 node 模块化,一个模块内被传入

  • __dirname
  • __filename
  • exports
  • module
  • require()

模块化有什么好处

  • 高内聚
  • 低耦合
  • 易维护

node依赖的是 commonjs 规范

  • 一个文件就是一个模块
  • 使用 require 来引用,require() 能够写入代码逻辑,不用置顶
  • 使用 exports/module.exports

扩展:

  • 浏览器中的模块化
    • CMD:seajs 就近依赖
    • AMD:requirejs 前置依赖
  • ES6标准模块

经过一些例子深刻了解 node 的模块化

第一个例子:node 模块没有输出

// 文件a
const a = 1;
const b = function() { console.log('this is file a'); }

// 文件b
const fileA = require('./a.js');
console.log(fileA);
复制代码

you know nothing

其实 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');
复制代码

系列文章将按期更新,往期文章会按期优化

相关文章
相关标签/搜索