场景

CommonJs

JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器。然而, JavaScript
标准定义的API 是为了构建基于浏览器的应用程序。并没有制定一个用于更广泛的应用程序
的标准库。CommonJS 规范的提出,主要是为了弥补当前JavaScript 没有标准库的缺陷。它的
终极目标就是:提供一个类似Python,Ruby 和Java 语言的标准库,而不只是让JavaScript 停
留在小脚本程序的阶段。用CommonJS API 编写出的应用,不仅可以利用JavaScript 开发客
户端应用,而且还可以编写以下应用。

服务器端JavaScript 应用程序。(nodejs)
命令行工具。
桌面图形界面应用程序。

简单概括一句话:

CommonJS 就是模块化的标准,nodejs 就是CommonJS(模块化)的实现。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

Nodejs中的模块化

Node 应用由模块组成,采用CommonJS 模块规范。

在Node中,模块分为两类:

一类是Node 提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块。
核心模块部分在Node 源代码的编译过程中,编译进了二进制执行文件。在Node 进
程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和
编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。
如:HTTP 模块、URL 模块、Fs 模块都是nodejs 内置的核心模块,可以直接引入使用。
    文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程、
速度相比核心模块稍微慢一些,但是用的非常多。这些模块需要我们自己定义。接下来我
们看一下nodejs 中的自定义模块。

CommonJS(Nodejs)中自定义模块的规定

1.我们可以把公共的功能抽离成为一个单独的js 文件作为一个模块,默认情况下面这
个模块里面的方法或者属性,外面是没法访问的。如果要让外部可以访问模块里面的方法或
者属性,就必须在模块里面通过exports 或者module.exports 暴露属性或者方法。

2. 在需要使用这些模块的文件中,通过require 的方式引入这个模块。这个时候就可
以使用模块里面暴露的属性和方法。

自定义模块简单示例

在项目目录下新建文件夹module用来存放自定义的公共模块。

在module下新建tools.js

function formatName(api){return "公众号:"+api;
}exports.formatName=formatName;

自定义模块中新建一个函数,并通过exports暴露。

然后在项目目录下新建test1.js

在test1.js中,通过

const tools = require('./module/tools.js');

引入模块

然后通过

var name = tools.formatName('霸道的程序猿');

调用模块的方法

最后输出

console.log(name);

test1.js完整示例代码

const tools = require('./module/tools.js');
var name = tools.formatName('霸道的程序猿');
console.log(name);

然后打开终端运行

node test1.js

自定义模块含有多个方法

如果自定义模块中含有多个方法,即将自定义模块定义为对象,其下有多个方法。

var tools = {sayName:function(){return "公众号:";},sayValue:function(){return "霸道的程序猿";}
}exports.sayName = tools.sayName;
exports.sayValue = tools.sayValue;

然后新建test2.js

var tools = require('./module/tools');
console.log(tools.sayName());
console.log(tools.sayValue());

运行test2.js

node test2.js

自定义模块的约定路径

在项目下新建node_modules目录,在此目录下新建一个自定义模块的文件夹,比如新建axios,并在axios下新建index.js

exports.get=function(){console.log('从服务器获取数据')
}exports.post=function(){console.log('提交数据')
}

模拟从服务器获取数据和提交数据。

然后在项目目录下新建test3.js

const axios=require('axios');axios.get();axios.post();

文件位置如下

可以看到此时引入自定义模块的路径为

const axios=require('axios');

先运行下test3.js

node test3.js

这里引入自定义模块没有使用全路径直接使用

const axios=require('axios');

就可以引用的原因是node会默认寻找node_modules目录下对应模块名字目录下的index.js这个模块

这里必须是index.js

如果名字不是index.js,比如这里改名为badao.js就会报错

可是如果说非要使用badao.js自定义的名字不使用index.js的话怎么办。

比如我们在node_modules下新建badao文件夹,其下面的模块起名为badao.js而不是index.js

exports.get=function(){console.log('从badao获取数据')
}exports.post=function(){console.log('提交数据到badao')
}

然后找到badao.js所在的文件夹下打开命令行输入

npm init

此时会在badao.js同级目录下生成package.json

{"name": "badao","version": "1.0.0","description": "","main": "badao.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

此文件就会表明此模块的入口函数为badao.js

那么再引入badao模块时就会先找package.json

然后根据其入口函数去查找模块。

然后在项目下新建test4.js

const badao = require('badao');
badao.get();
badao.post();

运行test4.js

node test4.js

Nodejs模块、自定义模块、CommonJs的概念和使用相关推荐

  1. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...

    正则表达式 语法: mport re #导入模块名 p= re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个 ...

  2. python 自定义模块的发布和安装

    [学习笔记] 自定义模块  使用的是pycharm 说白了就是.py文件都可以作为模块导入,像定义一个文件 名字为Mycode __all__ = ["add","sub ...

  3. python自定义模块和三方模块_python基础知识8——模块1——自定义模块和第三方开源模块...

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  4. python基础--自定义模块、import、from......import......

    自定义模块.import.from......import...... 1)模块的定义和分类 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例 ...

  5. 自定义模块_Nginx自定义模块开发

    https://www.zhihu.com/video/1048730832663040000 环境:Ubuntu14.04 x86_64 Nginx:Nginx-1.13.10 编译安装Nginx ...

  6. import pymysql 没有模块_python模块与包

    模块的概念 •模块是一个保存了Python代码的文件,其中可以包含变量.函数或类的定义,也可以包含其他各种Python语句.使用模块有以下3方面的优势. •(1)模块提高了代码的可维护性.在程序开发过 ...

  7. nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)

    目录 Nodejs 基础 大前端开发过程中的必备技能 nodejs 的架构 为什么是 Nodejs Nodejs 异步 IO Nodejs 事件驱动架构 全局对象 全局变量之 process 核心模块 ...

  8. Nodejs中的模块系统

    一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...

  9. 自定义模块的查找方式

    在介绍自定义模块的查找方式之前,需要先介绍一下模块路径这个概念. 模块路径是Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组. 生成路径 创建module_path.js ...

最新文章

  1. Flutter组件学习(二)—— Image
  2. 【牛客 - 331E】炫酷划线(权值线段树,树状数组哈希,随机数)
  3. C++与QML交互(信号与槽通知QML,C++注册QML,QML结点映射C++类)
  4. Linux 2 unit7 挂载网络共享
  5. 公办低分二本_河南最适合“二本”考生的30所公办大学,录取分低,考生不要错过...
  6. java基础:13.2 集合框架 - LinkedList、Queue
  7. [独库骑行之我们路过高山]玉希莫勒盖达坂顶上的震撼
  8. 一、1.kaggel简街市场预测—baseline代码解析
  9. 他面前有一个人,有一把刀
  10. 史上最详细Sqlyog详细安装教程及使用
  11. python自动发微信api_调用微信API发送微信消息python脚本
  12. h5 input 阴影_CSS3文本阴影 text-shadow
  13. 微软混合现实设备HoloLens 2惊艳发布,售价2.4万人民币
  14. Single Threaded Execution模式
  15. 利用Excel制作问卷的饼状图
  16. FinalShell - 一个免费且好用的ssh工具
  17. 线性代数学习笔记——n维向量
  18. Python数据分析_第06课:数据清洗与初步分析_笔记
  19. 计算机专业的励志人物,北京科技大学计算机与通信工程学院-【毕业学子未来路】王禹:保入中科院的全国大学生励志人物...
  20. Sentinel流量防卫兵

热门文章

  1. IDEA的UML图详细介绍(二)
  2. Idea新建项目默认是JDK1.5解决办法
  3. oracle的获取年月日时间,获取5年前日期
  4. oracle主键自动增长
  5. 使用Git命令时出现fatal: this operation must be run in a work tree提示,该如何解决
  6. Nginx详细安装部署教程
  7. 圆的半径java_css中的圆形边界半径工件
  8. 网站刷关键词_中小企业网站排名如何做SEO优化 - 刷百度关键词排名
  9. python自动抓取指定信息_使用python自动转发抓取的网页信息
  10. 使用缓冲流有什么好处_使用PVC石笼网有什么好处?