Logan 如果前面还有路,答应我,跑下去...

Node.js入门-3-基础

2018-06-20
Logan

一、命令行窗口常用命令

  • dir :列出当前目录下所有文件及文件夹
  • cd dName :进入指定目录,cd ..为返回上级目录
  • md或者mkdir :创建文件夹
  • rd或者rmdir :删除文件夹
  • rd或者rmdir :删除文件夹
  • cls : 清屏
  • exit : 退出命令行

二、进程和线程

1. 进程

概念

进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程为程序的运行提供了必备的环境。

我们写的代码和程序都是放在进程里面的,相当于工厂中的车间

2. 线程

概念

线程是计算机中的最小计算单位,负责执行进程中的程序

相当于车间中的操作工人

单线程

  • js是单线程
  • 时间片分割

多线程

根据任务决定开启几条线程(占用内存)

Node服务器

  • 单线程,但很健壮,后台拥有一个I/O线程池进行调度
  • 分布式服务器部署

三、安装Node.js

Node.js下载

可在控制台使用node -v查看node版本

四、 Node开发需要模块化

  1. 在Node中,一个js文件就是一个模块
  2. 在Node中,通过require()函数来引入外部的模块
  3. 在Node中,每一个js文件中的js代码都是独立运行在一个小闭包中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问(目的:全局变量私有化,避免全局污染)
  4. 暴露模块中的变量和函数通过exports,只需要将需要暴露给外部的变量或方法设置为exports的属性即可
  // a.js
  let str = 'This is a string from another module'
  let fn = () => {
    console.log('This is a function from another module')
  }
  exports.str = str
  exports.fn = fn
  
  // b.js
  const a = require('./a.js')
  console.log(a.str)
  a.fn()

exportsrequire怎么来的

  • window不是Node中的全局对象
  • Node中有一个全局对象global,作用和window类似
  • exports 和 require 并不是全局变量

exportsrequire其实是函数的参数,之前说过在Node中,每一个js文件中的代码都运行在一个独立的闭包中,所以我们可以通过console.log(arguments.callee.toString())来看下闭包的代码

function (exports, require, module, __filename, __dirname) { // const file2 = require('./2')
// console.log('Hello World!')
// let a = 10, b = 20
// console.log(a * b)
// console.log(file2.str2)
// file2.fn2()
// console.log(global)
console.log(arguments.callee.toString())
}

Node文件组成剖析

  1. 当Node在执行模块中的代码时,它会将js文件中的代码用如下代码包裹起来
  function(exports, require, module, _filename, _dirname) {
    //***
  }
  1. 所以模块中的代码都是包装在一个函数中执行的,并且在函数执行的同时传递进了5个实参
  • exports: 该对象用来将函数内部的局部变量或局部函数暴露到外部
  • require: 用来引入外部的模块
  • module: 代表的是当前模块本身,

    exports就是module的属性;我们既可以使用exports导出,也可以使用module.exports导出
    Node为每个模块提供一个exports变量,指向module.exports。
    不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系

  • __filename: 当前模块的完整路径
  • __dirname: 当前模块所在文件夹的完整路径

exportsmodule.exports的区别

  1. exports变量指向module.exports,所以exports只能通过exports.xxx来向外暴露内部变量,如果直接将exports变量指向一个值,等于切断了exportsmodule.exports的联系
  2. module.exports可以通过module.exports.xxx,也可以直接赋值一个对象,module.exports = {xxx:yyy}来向外暴露内部变量

包和包管理器

概念

CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具,这组工具就叫做包。

组成

最重要的是包描述文件package.json

描述包的相关信息,以供外部读取分析,它是一个JSON格式的文件,位于包的根目录下

package.json文件中,不能加入任何注释

包管理器(NPM)

对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。

详见 Npm入门

如果在页面中因素node_modules中的某个模块,优先从当前目录引入,如果当前目录找不到,则往上级查找,直到根目录
故如果很多小项目依赖相同,可提取node_modules文件夹至父级目录以节省存储空间

五、 REPL(交互式解释器)

Node自带的REPL(Read Eval Print Loop 交互式解释器)表示一个电脑的环境,我们可以在终端中输入命令,并接收系统的响应。

交互式解释器可以执行以下任务

  • 读取 读取用户输入,解析输入了Javascript数据结构并存储在内存中。
  • 执行 执行输入的数据结构
  • 打印 输出结果
  • 循环 循环操作以上步骤指导用户两次按下Ctrl + c按钮退出
// 输入 node 来启动REPL交互式解释器
node

下划线_变量

在REPL中可以使用下划线_来获取上一个表达式的运算结果

常用命令

  • Ctrl + c按下两次: 退出Node REPL
  • Ctrl + d: 退出Node REPL
  • .help: 列出可使用命令
  • .break: 退出多行表达式
  • .clear: 退出多行表达式
  • .save filename: 保存当前的Node REPL会话到指定文件
  • .load filename: 载入当前的Node REPL会话的文件内容

类似文章

留言