1.准备工作
1)命令行窗口
又名:cmd窗口、小黑屏、终端、shell
表示当前所在目录
2)常用指令
dir:列出当前目录下的所有文件
cd 目录名:进入指定的目录
md 目录名:创建一个文件夹
rd 目录名:删除一个文件夹
3)目录
.表示当前目录
…表示上一级目录
4)环境变量(windows系统中的变量)
当我们在命令行窗口打开一个文件或者调用一个程序时,系统会先在当前目录下寻找文件程序,若找到了就直接打开,若没有找到则会依次到环境变量path的路径中寻找,直到找到为止,若没有找到则报错。
tips:我们可以将一些经常访问的程序和文件的路径添加到path中,这样我们就可以在任意位置来访问这些文件和程序了。
5)进程和线程
进程:
进程负责为程序的运行提供必备的环境,进程相当于工厂中的车间一样。
线程:
线程是计算机中最小的计算单位。线程负责进程中的程序。线程就是工厂中的工人。
单线程:
js、浏览器
why?浏览器是单线程?
假如是多线程,一个线程负责渲染页面,一个线程负责运行js代码,js中在改样式,两个想要的效果不一样,该听谁的?谁都不能听。所以js是单线程,在执行js代码的时候,网页是停止渲染的。js执行完之后,渲染网页。
多线程:(主流)
2.正式进入Node.js
2.1.Node.js是什么?
初衷:用js代码写出一个高性能的web服务器。
Node.js是一个能够在服务器端运行的Javascript运行环境
实则是直接将js代码从前端拿到了我们的后台(服务器)
Node是单线程
采用V8引擎运行js代码
2.2Node的用途
实时多人游戏
基于web的应用
即时通信
后端Web服务,跨域、服务器端的请求
处理不了太大的问题。需要用java
2.3.node模块化
好处:降低耦合,方便代码复用,降低开发成本
若程序设计的规模达到了一定程度,则必须进行模块化
引入CommonJs
CommonJs对模块化的定义
-模块引用
-模块定义
-模块标识
-模块定义:
模块化:在Node中,一个js文件就是一个模块
-模块引用:
2.3.1在Node中如何引入外部模块?
通过require()函数来引入外部模块,require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,这里的路径,如果使用相对路径,必须以.或…开头
使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
var md=require(“./module1.js”)
在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
2.3.2向外部暴露属性或方法
通过==exports(一个全局变量)==来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
exports.x=“我是module1.js中的x”
-模块标识:
我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
-模块分为两大类:
1.核心模块
由node引擎提供的模块
核心模块的标识就是模块的名字
eg: var fs=require(‘fs’)
2.文件模块
由用户自己创建的模块
文件模块的标识就是文件的路径(绝对路径、相对路径)
相对路径使用.或…开头
在node中有一个全局对象global,它的作用和网页中的window类似
在全局中创建的变量都会作为global的属性保存,在全局中创建的函数都会作为global的方法保存。
当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
function(exports,require,module,_filename,__dirname){
在代码的最底部,添加如下代码
}
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参。
exports
-该对象用来将变量或函数暴露到外部
require
-函数,用来引入外部模块
module
-代表的是当前模块本身
exports就是module的属性
既可以使用exports导出,也可以使用module.exports导出
__filename
当前模块的完整路径
__dirname
当前模块所在文件夹的完整路径
module.exports和exports的区别?
-通过exports只能使用.的方式向外暴露内部变量
exports.xxx=aaa
-而module.exports既可以通过.的形式,也可以直接赋值
module.exports.xxx=aaaa
module.exports={}
exports改的是变量
本来exports=module.exports,即exports指向的是module.exports
exports向外暴露内容需要exports.xxx才可以
而module.exports向外暴露内容可以.xxx也可以直接暴露
栈内存和堆内存
一看到new就意味着需要在堆内存中创建一个新的空间,此空间专门用来放对象,对象没有名字,只有内存地址。
3.package
CommonJs的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。
CommonJs的包规范由包结构和包描述文件两个部分组成
包结构
-用于组织包中的各种文件
包描述文件
-描述包的相关信息,以供外部读取分析
包实际上是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件。
-package.json 描述文件(必须的)
-bin 可执行二进制文件
-lib js代码
-doc 文档
-test 单元测试
json文件中不能写注释