node入门学习

对于node学习断断续续了好久,没有完整系统的学下来,上周涛哥说起在我们前端组也学习一下node来做后端
;趁着最近不忙又重新学习了一下,现在重新梳理一些基础的知识;

  • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
    • 事件驱动:当触发某个事件的时候,执行事件中指定的代码!
    • 非阻塞式 I/O 的模型:采用非阻塞的操作,能够提高CPU处理的效率!代码表现形式
      是:会经常写回调函数。

node对文件的操作,使用fs模块来操作文件

  1. fs.readFile

  2. fs.writeFile

  3. fs.appendFile

node 中如何实现模块化
在Node中基于CommonJS规范,通过三个东西实现模块化:

  • module:表示一个模块,在Node中,最常见的模块,就是一个个的JS文件!
  • require:作用是加载其他模块用的;在一个JS文件中,如何引用其他JS文件中的成员呢?就是用require
  • exports:在Node的模块中,如果这个模块需要向外暴露一些成员,供其他JS模块使用,那么,需要使用exports向外暴露这些成员!

注意:Node 中的模块化,主要解决的JS文件之间的相互依赖关系!

模块加载规则

  1. 优先从缓存中加载
    • 使用 delete require.cache[__filename] 来防止模块被缓存,但是一般不建议这么用,因为模块的缓存能够提高运行效率;
  2. 加载核心模块:优先从缓存中加载;如果缓存中没有的话,再去执行加载核心模块!
  3. 自己的模块:优先从缓存中加载;如果缓存中没有的话,再去执行加载用户模块!

    注意:我之前遇到一个问题,从npm下载包,下载完包后项目一直跑不起来,下载也没报错,后来问肖遥,肖遥帮忙解决了这个问题,
    用npm cache clean –force强制清一下缓存;这就是因为它这个加载是优先从缓存里加载,如果本地缓存中没有的话
    再去执行加载核心模块,但是一般不建议这么用,因为模块的缓存能够提高运行效率!

  4. 第三方模块查找规则:

    1. node首先,查看项目根目录中有没有 node_modules 文件夹
    2. 查找 node_modules 文件夹中,有没有和第三方模块名称一致的文件夹
    3. 在模块对应的文件夹中,查找有没有 package.json 这个文件
    4. package.json 文件中,查找有没有 main 属性
    5. 如果有 main 属性,并且 main 属性指向的路径存在,那么就尝试加载这个路径指定的文件!
    6. 如果 package.json 文件中,没有 main 属性,或者 main 属性指向的路径不存在,或者没有package.json 文件, 那么,Node尝试加载 模块根目录中 index 相关文件:index.js -> index.json -> index.node
    7. 如果在node_modules文件夹中,找不到对应的模块文件夹,或者在项目根目录中根本没有node_modules文件夹,则向上一层文件夹中去查找,查找规则同上!
    8. 如果上一层目录中也没有查找到,则再向上翻一层去查找,直到找到当前项目所在的盘符根目录为止!
    9. 如果找到了盘符根目录还找不到,则报错:cannot find module ***

      2018-08-25 —黄镇