node 中的模块使用

Node 中的模块的分类

node由三部分组成:ECMAScript + 核心模块 + 第三方模块

核心模块

  • 官方发现一些功能模块使用非常频繁,所以官方把这些模块,编译成了二进制可执行文件,打包到了Node的安装包中;这些核心模块就已经随着安装Node时候,被安装到了本地;

  • 如何使用核心模块 使用require('核心模块的名称’);

第三方模块

  • 第三方模块:除了官方提供的好用的核心模块之外,我们程序员发现,还有一些使用也很频繁的代码和方法,一些牛逼的团体、个人、公司,开发出了好用的模块,通过NPM官网,托管出去,供其他人下载使用的这些模块;
    统称为第三方模块;

  • 我们在开发的过程中,经常需要使用到各种各样的第三方模块

  • 使用方式:下载安装 >> 引入 >> 使用

  • 用户模块

    • 由于业务的需要,程序员自己定义的完成某些特定功能的JS文件,统统称为用户模块!

    • 它的引入也是使用require()

    • 使用方式:创建 >> 引入 >> 使用

第三方模块的使用

  1. 先使用npm下载这个模块!【注意:在安装第三方模块的时候,安装的名字,就是你在require时候导入的名字】

  2. 使用require导入这个第三方模块!

  3. 通过官方文档,试着去使用这个第三方模块!

  4. 注意:无论是核心模块、还是第三方模块,都是通过 require来引用这个模块的!

  5. 一个简单的第三方模块使用的案例

1 // 这个文件演示一下如果使用第三方模块moment实现日期数据的格式化处理
2 // 1. 引入moment(引入之前确保这个模块已经正确的下载哦)
3 const moment = require('moment')
4
5 // 2.定义一个日期,现在日期值是未格式化的日期数据
6 let timeNow = new Date()
7
8 // 3.调用moment实现对日期数据的格式化处理
9 console.log(moment(timeNow).format('YYYY-MM-DD HH:mm:ss'))

导出用户模块中的成员

exports

- 它是一个对象,我们可以在这个对象上挂载你想暴露的成员

- 使用.语法在exports上挂载成员

- 使用自定义模块举例:

// 我们所创建的js文件就可以认为是一个自定义模块
var obj = {
    name:'jack',
    age:20
}

function sayHi(){
    console.log('我的名字叫:'+obj.name+",我的年龄是:"+obj.age)
}

// 在模块中有一个默认的对象exports,这个对象在在这个模块被引入的时候会自动的返回
// 我们导出成员的方式就是在这个对象上挂载你想暴露的成员
exports.sayHi = sayHi
exports.aa = obj

使用自定义模块:

// 如何使用用户自定义模块:
// 所有模块想使用都要先引入
// 如果引入一个模块,那么这个模块默认会返回一个对象
var umodule = require('模块文件的路径')
umodule.sayHi()

module.exports

- 它是一个对象,我们可以在这个对象上挂载你想暴露的成员

- 使用.语法在module.exports上挂载成员

- 也可以将module.exports重置为一个新的对象,对象中就包含你想暴露的成员 ,只要引入这个模块成员就会自动暴露

// 引入一个模块,还会自动的暴露这个模块的module.exports对象

module.exports = {
  name: 'rose',
  say: function () {
    console.log(this.name)
  }
}

1.定义用户模块

// 我们所创建的js文件就可以认为是一个自定义模块
var obj = {
    name:'jack',
    age:20
}
function sayHi(){
    console.log('我的名字叫:'+obj.name+",我的年龄是:"+obj.age)
}

// 在模块中有一个默认的对象module.exports,这个对象在这个模块被引入的时候会自动的返回
// 我们暴露成员的方式就是在这个对象上挂载你想暴露的成员

// module.exports.sayHi = sayHi
// module.exports.aa = obj
// 也可以直接使用你想暴露的成员覆盖module.exports
module.exports = sayHi

exports 和 module.exports 的区别

  1. 通过 module.exports 可以使用 . 语法的形式追加属性,也可以使用 = 直接赋值的形式导出成员;

  2. exports 只能通过 . 的形式追加属性;不能使用 = 直接赋值的形式!

  3. 注意: 在一个 module 中,最终向外暴露的成员,以 module.exports 指向的对象为准!

  4. 在一个模块中,不要混合使用 module.exportsexports

  5. 如果使用点语法,没有区别
  6. 如果使用重置对象,只能使用module.exprts

使用原则

  • 能使用module.exports就不要使用exports

  • 如果模块中只有一个成员需要暴露,就直接赋值给你想暴露的成员

  • 如果有多成员需要暴露,就写在module.exports的对象中

模块查找(加载)规则

  1. 优先从缓存中加载:如果缓存中有这个模块就直接从缓存中加载(不会再去编译指定的模块),如果缓存中没有,就加载模块,同时存储到缓存

  2. 加载核心模块:优先从缓存中加载;如果缓存中没有的话,再去执行加载核心模块!

  3. 用户自定义模块:优先从缓存中加载;如果缓存中没有的话,再去执行加载用户模块!

用户模块的查找规则:
如果不写后缀名,则先严格按照给定的文件名去查找模块并加载执行;按顺序查找文件,找到则不再继续查找
index   ->  index.js  ->   index.json    ->  index.node

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

  1. 首先,查看项目根目录中有没有 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    

(0)

相关推荐

  • webpack之性能优化(webpack4)

    在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...

  • 关于前端开发中的模块化

    前端开发离不开模块化,与模块化有关的关键字有以下几个: require/module.exports export/import define/require/exprots define/seajs ...

  • 消防报警系统中消防模块分类与用途简介

    我们知道消防报警联动主机在火灾发生的时候会接收到相关信号,一旦接收的信号符合相关逻辑关系,报警联动主机会按照既定程序发生一连串联动的动作,以达到延缓火灾的蔓延,最终达到灭火的目的.这一系列功能程序的实 ...

  • PCL中outofcore模块---基于核外八叉树的大规模点云的显示

    这里主要针对PCL库中outofcore做一些介绍,查询外网文献以及相关模块的相关资料写出以下内容,该模块就是为了实现大规模点云的载入与显示,渲染等问题. 什么是outofcore outofcore ...

  • 传统方法的点云分割以及PCL中分割模块

    有兴趣的小伙伴可以查阅历史文章,同时也欢迎小伙伴们积极分享与公众号主题相关的文章.在公众号的菜单栏开放了企业招聘.有需要的可以按要求发布招聘信息,你也可以把身边的HR推荐给群主,参与进来. 摘要 三维 ...

  • Python3中tkinter模块使用方法详解

    转载自 覆手为云p 的博客,附上原文网址,感觉非常有用,存下档,谢谢帮助~~~ https://www.cnblogs.com/aland-1415/p/6849193.html 1.使用tkinte ...

  • 594 Node之http模块开发web服务器

    什么是Web服务器? 当应用程序(客户端)需要某一个资源时,可以向一个台服务器,通过Http请求获取到这个资源:提供服务器的这个服务器,就是一个Web服务器: Web服务器 目前有很多开源的Web服务 ...

  • Node中的流

    一.流的概念 stream是数据集合,与数组.字符串差不多.但stream不一次性访问全部数据,而是一部分一部分发送/接收(chunk式的),所以不必占用那么大块内存,尤其适用于处理大量(外部)数据的 ...

  • node之path模块

    D:\node-path\tests\test.js;D:\project-mindmap\docs\navi.json路径名(dirname)文件名(basename)定界符(delimeter)路 ...

  • opencv中ArUco模块实践(1)

    论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...

  • 首个任务型对话系统中生成模块资源库Awesome-TOD-NLG-Survey开源!

    原创作者:覃立波.黎州扬.娄杰铭.禹棋赢.车万翔 代码链接:https://github.com/yizhen20133868/Awesome-TOD-NLG-Survey 转载须标注出处:哈工大SC ...