模块化的基本概念

什么是模块化?

模块化是解决一个复杂问题时,自顶向下逐层把系统划分为若干个模块的过程,编程中,就是遵守一定规则,把一个大文件拆成独立并相互依赖的多个小模块。

模块化规范

使用什么样的语法格式引用模块和向外暴露成员

CommonJS规范

Node.js 遵循了 CommonJS 的模块化规范。其中:

  • 每个模块内部,module变量代表当前模块
  • 导入其它模块使用require()方法
  • 模块对外共享成员使用 module.exports 对象

ES6 模块化规范

是浏览器端与服务器端通用的模块化开发规范。它的出现极大的降低了前端开发者的模块化学习成本,开发者不需再额外学习 AMD、CMD 或 Commonjs 等模块化规范。

ES6 模块化规范中定义:

  • 每个js文件都是一个独立的模块
  • 导入其它模块成员使用 import 关键字
  • 向外共享模块成员使用 export 关键字

在Node.js中设置ES6模块化规范:

  1. 安装v14.15.1或更高版本的node.js
  2. package.js的根节点添加"type:""module"节点

Node.js中的模块化

Node.js中模块的分类

  • 内置模块:官方提供的fs、path、http等
  • 自定义模块:用户创建的每个.js文件,都是自定义模块
  • 第三方模块:由第三方开发的,需要下载的模块

加载模块

文章以CommonJS规范为例

//内置模块
const http = require('http')
//自定义模块
const custom = require('./custom.js')//后缀名可以省略
//第三方模块
const moment = require('moment')

注意:当使用require加载时,会执行被加载模块的代码

模块作用域

在自定义模块中定义的变量和方法等成员,只能在当前模块被访问,防止全局变量污染的问题

//username.js
const username='张三' function sayHello(){
console.log("大家好,我是"+username)
} //test.js
const custom=require('./username')
console.log(custom)//输出:{} 空对象

向外共享成员

module对象

每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息

module.exports对象

在自定义模块中,可以使用它将模块内的成员共享出去,当使用require()方法导入时,得到的就是module.exports所指的对象

//username.js
module.exports.username = '张三'
module.exports.sayHello = function () {
console.log("大家好,我是" + username)
}

注意:

  • module.exports默认指向空对象
  • 使用require()方法导入的结果,以module.exports指向的对象为准

exports对象

为了简化,Node提供了exports对象。默认情况下,exportsmodule.exports指向同一个对象。

exports.username= '张三'
module.exports={
gender:'男',
age:22
}
//{gender:'男',age:22}
module.exports.username= '张三'
exports={
gender:'男',
age:22
}
//{username:'张三'}
  • 使用require()方法导入的结果,永远以module.exports指向的对象为准
  • 防止混乱,不要在同一个模块中同时使用exportsmodule.exports

npm和包

在Node.js中第三方模块叫做,来自于第三方个人或团队,免费且开源。

包基于内置模块封装出来,提供了更高级、更方便的API,极大的提高了开发效率。

包的下载

  • https://www.npmis.com/ 网站上搜索自己所需要的包
  • 从https://registry.npmis.org/ 服务器上下载自己需要的包

使用npm包管理工具(Node Package Manager)

npm install 包的完整名称
npm i 包的完整名称 -g//全局安装
npm install moment@2.22.2 npm uninstall 包的完整名称

node_modules文件夹用来存放所有已安装到项目中的包

package-lock.json配置文件用来记录node_modules目录下每一个包的下载信息

包的版本号:“点分十进制”

第一位数字:大版本

第二位数字:功能版本

第三位数字:Bug修复版本

(只要前面的版本号增长,后面归零)

包管理配置文件

npm规定,项目根目录中,必须提供一个package.json的包管理配置文件

npm init -y//快速新建package.json

dependencies节点

专门记录使用npm insatll命令安装了哪些包

npm install
//执行该命令,npm会读取package.json中的dependencies节点,一次性下载所有的包

devDependencies节点

如果某些包只在开发中用到,建议安装在devDependencies节点

npm i 包的完整名称 -D
npm i 包的完整名称 --save-dev

包下载慢的问题

切换npm的下包镜像源

npm config get registry //查看当前镜像源
npm config set registry=xxxxxxxxxx//切换镜像源

nrm工具

npm i nrm -g
nrm ls//查看所有镜像源
nrm use taobao//切换镜像源

包的分类

项目包和全局包、开发依赖包和核心依赖包

规范的包结构

  1. 包必须以单独的目录出现
  2. 包的顶级目录必须包含package.json这个包配置文件
  3. package.json必须包含nameversionmain这三个属性,分别代表包的名字、版本号、包的入口

NodeJs的模块化和包的更多相关文章

  1. nodejs学习笔记之包、模块实现

        简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点.       首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...

  2. 通过NPM快速发布你的NodeJS模块(组件包)

    1.更新 NPM - [ npm install -g npm | 该步骤可选:最好使用新版本] 楼主当前版本号 2.6.1 ,如果更新报错,可以尝试 国内淘宝镜像 $ npm -v 2.6.1 // ...

  3. 前端模块化 、包管理器、AMD、 CMD、 require.js 、sea.js

    问题由来,为什么要前端模块化管理: 假设我们有个组件名为Acomponent.js, 是架构封装的,里面依赖另一个公司公用库common.js: 那我们引入Acomponent.js的时候,怎么知道要 ...

  4. nodejs编译sass模块包 node-compass,与gulp包gulp-sass使用方法

    简介:node express或者就是node项目中,要自动编译sass方法很多,比如gulp 比如考拉,比如今天我想说的这个包node-compass. 编译sass的三种方法: 前提条件: 都需要 ...

  5. Nodejs的模块化

    Node.js中的模块化 好处: 复用性高,一次定义,多次使用 前端模块化 AMD AMD的实现需要使用 require.js CMD CMD的实现需要使用 sea.js [ 不更新 ] Common ...

  6. node-basis(提供nodejs开发的基础包)

    地址: https://github.com/flybirdsoft/use-node-basis

  7. NodeJs第3方包说明

    formidable 作用:实现简单文件上传 var formidable = require('formidable'); var form = new formidable.IncomingFor ...

  8. 浅析 Nodejs 模块化

    本文只讨论 CommonJS 规范,不涉及 ESM 我们知道 JavaScript 这门语言诞生之初主要是为了完成网页上表单的一些规则校验以及动画制作,所以布兰登.艾奇(Brendan Eich)只花 ...

  9. NodeJS 中npm包管理工具

    NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从 ...

  10. 【前端】NodeJs包管理工具NPM

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS部署上的很多问题. 测试是否安装成功,出现版本提示表示安装成功. npm -v NPM常用命令 官方文档:https://www.npm ...

随机推荐

  1. python菜鸟学习: 7. 购物车升级版,用户、商品信息存储,修改,新增

    # -*- coding: utf-8 -*-import os'''用户入口:1. 商品信息存在文件里2. 已购商品,余额记录商家入口1. 可以添加商品,修改商品价格商品信息:commdList.t ...

  2. MongoDB 分片模式

    Sharding (分片模式) 副本集可以解决主节点发生故障导致数据丢失或不可用的问题,但遇到需要存储海量数据的情况时,副本集机制就束手无策了.副本集中的一台机器可能不足以存储数据,或者说集群不足以提 ...

  3. font-awesome vue/react 通用的图标

    在开发项目中遇到了矢量图标 一套绝佳的图标字体库和CSS框架 vue 中引入font-awesome 直接npm install font-awesome --save 就可以了,里边包含了样式和字体 ...

  4. resttemplate 由于框架原因自带了转xml方式,不改变框架底层情况下,修复为返回json格式

    RestTemplate httpClientTemplate = new RestTemplate(); List<HttpMessageConverter<?>> conv ...

  5. [fiddler的使用]模拟自动回复功能在模拟测试mock第三方对接系统的返回中的使用场景

    [场景描述]在许多对第三方的测试过程中,由于第三方没有测试环境或者测试环境同步开发的时候还未准备好,或者系统间联调时对方还未完成的各种情况下,我们可以通过fiddler来模拟对方的返回. [操作步骤] ...

  6. 在css 中使用calc并且含有变量

    bottom:~"calc(.9rem + constant(safe-area-inset-bottom))";   bottom:~"calc(.9rem + env ...

  7. pt-table-check和pt-table-sync实践

    如果主库使用非默认端口,--recursion-method默认值为hosts,这时如果从库没有配置report_host参数(注意该参数缺点),则pt-table-checksum无法自动检测到从库 ...

  8. C语言初级阶段4——数组3——字符数组

    C语言初级阶段4--数组3--字符数组 字符数组的定义:储存字符类型数据的集合 1.注意:如果用字符串给字符数组初始化,那么不需要{},但是要有"". 2.%s :用来输出字符串的 ...

  9. Vue二级联动上传图片

    二级联动的后台和之前一样都需要一个字典字段查询来实现二级联动 但是由于VUE语法和AJAX的不同在前台绑定的时候也有所不同 2.1 首先下拉框的写法就有了本质的改变通过v-model="&q ...

  10. 「进阶」缓解眼睛疲劳,防蓝光保护视力,关爱健康!- CareUEyes

    软件官网地址:https://care-eyes.com/ 显示 对于显示页面来说 8 个模式下面都有对应的介绍说明,不再介绍.笔者建议软件调节之前,先退出软件,用系统自带的亮度调节,进入电源选项中进 ...