Node.js:
Node.js是将Chrome的V8引擎抽取出来形成了一个JavaScript的运行环境,可以运行在服务器端。
Node.js主要运行ECMAScript 6
Node.js采用事件驱动,非阻塞I/O模型
Node.js中JavaScript的组成部分:
ECMAScript核心+全局成员+API模块系统(系统模块/第三方模块/自定义模块)
全局成员:console/setTimeout/setinterval
浏览器和node中的js区别:
浏览器中js组成:ECMAScript核心+DOM+BOM
Node中js组成::ECMAScript核心+全局成员+模块系统(系统模块/第三方模块/自定义模块)
文件读取:
fs 核心模块中 提供了一个 fs.readFile方法,来读取指定目录下的文件
fs.readFile 有三个参数:
参数1 表示要读取的文件的路径
参数2 表示 要以什么样的编码格式来读取指定的文件,默认编码格式为null
参数3 表示当文件读取完成,调用这个callback来回调函数来处理读取的结果
fs.readFile(./files/1.txt,‘utf-8’,(err,data)=>
读取文件信息
fs.stat:
参数:err,stats
fs.stat(__dirname + ‘/files/1.txt’,‘utf-8’,(err,stats)=>
复制文件
fs.copyFile
参数:err
第一个拷贝来源,第二个拷贝目的名
fs.copyFile(__dirname + ‘/files/1.txt’, __dirname+ ‘/files/1-copy.txt’,(err)=>
路径常量:
__dirname: 获得当前执行文件所在目录的完整目录名
如果路径设置相对路径,执行拼接时候容易出现问题。
fs.readFile(__dirname + ‘/files/1.txt’)
使用fs模块操作文件的时候,一定要使用__dirname去拼接路径
完整路径不包含文件名
__filename: 获得当前执行文件的带有完整绝对路径的文件名
完整路径包含文件名
process.cwd():获得当前执行node命令时候的文件夹目录名
./: 文件所在目录
JavaScript有且仅有一个全局对象,在浏览器中,叫window对象。
而在Node.js环境中,也有唯一的全局对象,但不叫window,而叫global
global不推荐使用,存在全局变量污染问题
process也是Node.js提供的一个对象,它代表当前Node.js进程。
JavaScript程序是由事件驱动执行的单线程模型,Node.js也不例外。
如果我们想要在下一次事件响应中执行代码,可以调用process.nextTick():
path是平台特定的路径片段分隔符
windows 默认是
path.sep 路径分隔符
path.basename 是获取文件名称
path.dirname 是获取所在的路径
path.extname 是获取文件扩展名
模块作用域:
1.module(模块标识)
module属性是Common JS规范中定义的,它是一个对象,表示当前这个具体的js模块;
2.require(引用模块)
每一个实现了 CommonJS 规范的模块,必须定义一个 require() 函数,使用这个 require 函数,就能够 很方便的导入其它 模块中的成员,供自己使用;
3.exports(暴露模块成员)
每一个模块中,如果想要把自己的一些私有成员,暴露给别人使用,那么,必须实现一个 exports 对象,通过exports对象,可以方便的把模块内私有的成员,暴露给外界使用;
如果要输出一个函数或数组,必须直接对module.exports对象赋值。
模块的分类:
核心模块:http fs path
文件模块:var util = require(‘./util.js’)
第三方模块:var promjse = require(‘bluebird’)
模块的流程:
创建模块:创建后缀为js的
导出模块:exports.add = function(){}
加载模块:var teacher = require(‘./teacher.js’)
使用模块:teacher.add(‘scott’)
commonJS
每个文件就一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
module.exports 模块对外输出的值
CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
require()用来引入外部模块;
nodejs和commonjs区别?
commonjs是规范,nodejs是这种规范的实现。
模块加载机制
当一个模块初次被require的时候,会执行模块中的代码,当第二次加载相同模块的时候,会优先从缓存中查找。
优点:提高模块的加载速度;不每次重复执行加载模块。
核心模块加载机制:先查找缓存;如果缓存中没有,再去加载核心模块。
用户模块加载机制:先查找缓存;缓存没有尝试加载用户模块;如果在加载用户模块时候省略后缀名,则:
1.严格按照指定的名称去查找
2.尝试加载后缀名是.js文件
3.如果没有.js 则尝试加载.json文件
4.如果没有.json 则尝试加载.node文件
查找规则:index -> index.js -> index.json -> index.node
浏览器的AMD和CMD模块化规范