Node.js基础

Node.js基础

刘听风 144 2019-01-23

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模块化规范