Nodejs模块、自定义模块、CommonJs的概念和使用
场景
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的概念和使用相关推荐
- python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time datetime模块...
正则表达式 语法: mport re #导入模块名 p= re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个 ...
- python 自定义模块的发布和安装
[学习笔记] 自定义模块 使用的是pycharm 说白了就是.py文件都可以作为模块导入,像定义一个文件 名字为Mycode __all__ = ["add","sub ...
- python自定义模块和三方模块_python基础知识8——模块1——自定义模块和第三方开源模块...
模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...
- python基础--自定义模块、import、from......import......
自定义模块.import.from......import...... 1)模块的定义和分类 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例 ...
- 自定义模块_Nginx自定义模块开发
https://www.zhihu.com/video/1048730832663040000 环境:Ubuntu14.04 x86_64 Nginx:Nginx-1.13.10 编译安装Nginx ...
- import pymysql 没有模块_python模块与包
模块的概念 •模块是一个保存了Python代码的文件,其中可以包含变量.函数或类的定义,也可以包含其他各种Python语句.使用模块有以下3方面的优势. •(1)模块提高了代码的可维护性.在程序开发过 ...
- nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)
目录 Nodejs 基础 大前端开发过程中的必备技能 nodejs 的架构 为什么是 Nodejs Nodejs 异步 IO Nodejs 事件驱动架构 全局对象 全局变量之 process 核心模块 ...
- Nodejs中的模块系统
一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...
- 自定义模块的查找方式
在介绍自定义模块的查找方式之前,需要先介绍一下模块路径这个概念. 模块路径是Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组. 生成路径 创建module_path.js ...
最新文章
- Flutter组件学习(二)—— Image
- 【牛客 - 331E】炫酷划线(权值线段树,树状数组哈希,随机数)
- C++与QML交互(信号与槽通知QML,C++注册QML,QML结点映射C++类)
- Linux 2 unit7 挂载网络共享
- 公办低分二本_河南最适合“二本”考生的30所公办大学,录取分低,考生不要错过...
- java基础:13.2 集合框架 - LinkedList、Queue
- [独库骑行之我们路过高山]玉希莫勒盖达坂顶上的震撼
- 一、1.kaggel简街市场预测—baseline代码解析
- 他面前有一个人,有一把刀
- 史上最详细Sqlyog详细安装教程及使用
- python自动发微信api_调用微信API发送微信消息python脚本
- h5 input 阴影_CSS3文本阴影 text-shadow
- 微软混合现实设备HoloLens 2惊艳发布,售价2.4万人民币
- Single Threaded Execution模式
- 利用Excel制作问卷的饼状图
- FinalShell - 一个免费且好用的ssh工具
- 线性代数学习笔记——n维向量
- Python数据分析_第06课:数据清洗与初步分析_笔记
- 计算机专业的励志人物,北京科技大学计算机与通信工程学院-【毕业学子未来路】王禹:保入中科院的全国大学生励志人物...
- Sentinel流量防卫兵
热门文章
- IDEA的UML图详细介绍(二)
- Idea新建项目默认是JDK1.5解决办法
- oracle的获取年月日时间,获取5年前日期
- oracle主键自动增长
- 使用Git命令时出现fatal: this operation must be run in a work tree提示,该如何解决
- Nginx详细安装部署教程
- 圆的半径java_css中的圆形边界半径工件
- 网站刷关键词_中小企业网站排名如何做SEO优化 - 刷百度关键词排名
- python自动抓取指定信息_使用python自动转发抓取的网页信息
- 使用缓冲流有什么好处_使用PVC石笼网有什么好处?