【node】模块化与包(二)

1、模块化的基本概念

模块化是指解决一个复杂的问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。

(1)模块化的优点

遵循固定规则,把大文件拆分成对立并相互依赖的多个小模块

好处:

  • 提高代码的复用性;
  • 提高代码的可维护性;
  • 可以按需加载;

 (2)模块化规范

用什么语法格式引用模块,用什么语法格式向外暴露成员

2、CommonJS规定内容

CommonJS规定了模块特性和各模块之间如何相互依赖。

① 每个模块内部,module变量代表当前模块。

② module变量是一个对象,它的exports属性(module.exports)是对外的接口。

③ 加载某个模块其实是加载该模块的module.exports属性,用require()方法用于加载模块。

3、Node.js中模块三大分类

  • 内置模块(内置模块是由Node.js官方提供的,例如path,fs,http)
  • 自定义模块(用户创建的每个JS文件都是自定义模块)
  • 第三方模块(由第三方开发的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要下载)

 (1)require()方法可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。

const http = require('http');

使用require()方法加载其他模块时,会执行被加载模块中代码。

在使用require()加载用户自定义模块期间,可以省略.js的后缀名。

(2)模块作用域

在自定义模块中的变量以及方法等成员,只能在当前模块内被访问,这种模块级别的访问限制叫做模块作用域。(防止全局变量污染问题)

  (3) 向外共享模块作用域中的成员

       ① module对象 :每个JS自定义模块中都有一个module对象,里面存储了当前模块有关信息。

         ② module.exports 对象: 在自定义模块中,将模块内的成员共享出去,供外界使用。(外界用require方法导入的自定义模块时,就是module.export所指对象)

// 文件一 module.js
module.exports.username = 'sss'module.exports.sayHello = function(){console.log('Hello!')
}// 文件二
const m = require('./module');
console.log(m);// 文件二引用文件一结果 m打印结果
// { username: 'sss', sayHello: [Function (anonymous)] }

使用require()方法导入模块时,导入的结果永远module.exports指向的对象为准

        ③ exports对象 : 默认情况下 exports和module.exports指向同一个对象。最终共享的结果还是以module.exports指向的对象为准

1、require() 模块,永远都是module.export所指对象

4、npm包管理

(1)包的概念

Node.js中第三方模块叫做包。

包是由第三方个人或者团队开发出来的,基于内置模块封装出来的,免费共所有人使用,目的提高开发效率。

http://www.npmjs.com/

(2)常用指令

查看npm版本: npm -v

安装包:npm install 包完整名称/ npm i 包完整名称

安装指定版本的包(无需卸载):npm i 包名称@版本号

卸载:npm uninstall 包名称

版本号是点分十进制:第一位大版本,第二位功能版本,第三位bug修复版本,只要前面版本号增长了,后面版本就会归零。

(3)包的导入

// 导入需要的包,名称就是装包的名称
const moment = require(moment)

安装完成包后,项目文件夹多了node_modules和package-lock.json配置文件

node_modules:所有已安装到项目里的包

package-lock.json:包下载信息
(4)包管理配置文件(package-lock.json)

因为第三方包过大,共享时剔除node_modules

创建package.json: npm init -y(路径项目文件夹不能有中文空格)

dependencies:记录npm哪些包,开发和上线之后都用

devDependencies节点:开发用,上线后不用 npm i 包名称 -D

(5)使用cnpm与nrm

解决下包慢的问题:淘宝NPM镜像服务器

切换npm下包镜像源

// 查看当前下包镜像源
npm config get registry
// 更换为淘宝镜像
// https://registry.npm.taobao.org/已经过期了
npm config set registry=npm config set registry https://registry.npmmirror.com
// 检查是否下载成功
npm config get registry

nrm:快速查看和切换下包的镜像源

// 通过npm包管理器,将nrm安装为全局可用的工具
npm i nrm -g
// 查看所有可用镜像源
nrm ls
// 将下包镜像源切换为淘宝镜像
nrm use taobao

5、规范的包结构

包的分类:项目包、全局包

项目包分为开发依赖包与核心依赖包,开发依赖包只在开发期间用到,核心依赖包在开发期间与项目上线都会用到

全局包:安装到node_modules中 安装时 npm i 包名称 -g

安装i5ting_toc:npm install -g i5ting_toc

// 调用i5ting_toc,实现md文件转换html功能
i5ting_toc -f 要转换md文件路径 -o

 包的规范

一个规范的包,它的组成结构,必须符合以下3点要求:
① 包必须以单独的目录而存在;
② 包的顶级目录下要必须包含 package.json 这个包管理配置文件;
③ package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口,

6、发布包

以test-tools举例

(1)初始化包的基本结构

        ① 新建 test-tools 文件夹,作为包的根目录
        ② 在 test-tools 文件夹中,新建如下三个文件:
                package.json (包管理配置文件)
                index.js (包的入口文件)
                README.md(包的说明文档)

(2) 初始化package.json

{
"name": "test-tools",
"version": "1.0.0",
"main": "index.js",
"description":"提供了xxxx的功能",
"keywords". ["xx1", "xx2", "xx3"],
"license": "IsC"
}

 (3) 设计入口文件(main属性设计的入口文件)

// index.js
function xx1(){...return
}function xx2(){...return
}
...// 向外暴露需要成员
module.exports ={xx1;
}

(4) 模块化拆分

① 将不同功能拆分到不同js中去

② 在index.js中导入两个模块

③ 在index.js中,使用module.exports把对应方法共享出去

(5)把包发布到npm上

编写说明文档README.md是包的说明文档,markdown格式

安装方式、导入方式、功能模块的说明、开源协议

① 注册npm账号

② 终端登录npm账号(先切换官方服务器,不能用淘宝服务器)。上传包。

// 登录
npm login
// 把包发布到npm上,包名不能重复
npm publish

 ③ 如果要删除已发布包(72h 以内),删除后24小时不能重复发布

npm unpublish 包名称 --force

7、模块加载机制

(1)优先从缓存中加载:模块第一次加载后会缓存,多次调用require不会执行多次

(2)内置模块加载优先级最高

(3)自定义模块必须以./或者../开头路径标识符,扩展名加载顺序:确切文件名加载-.js-.json-.node-加载失败

(4)第三方模块加载机制,不是内置模块,也没有相对路径开头,从当前目录开始,尝试从node_modules文件中加载第三方模块,直到文件系统根目录为止

(5)目录作为模块,先寻找package.json,找main属性作为入口,如果没有或者入口不能解析,则从加载目录下找寻index.js文件,如果还是找不到,则报错:Error:Cannot find module 'xxx'


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot3 打包报错32-bit architecture x86 unsupported或者 returned non-zero result

springboot3 打包异常情况处理记录 在测试springboot3 native打包时候遇到的异常,百度和谷歌上方法都无法解决我的问题,最后记录一下我最后的原因和解决方案。 前置要求:自己处理好vs的相关内容后 报错一: [1/7] Initializing…

蓝桥杯算法训练VIP-数组查找及替换

题目 1634: 蓝桥杯算法训练VIP-数组查找及替换 时间限制: 3s 内存限制: 192MB 提交: 1629 解决: 890 题目描述 给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间&#xff0…

跨境电子商务支付与结算的支撑系统

​1、跨境电子商务支付与结算的核心系统。 核心系统是用户执行跨境电子商务支付的核心模块,包括以下具体流程。 ​ ​①用户从跨境电子商务支付应用启动跨境电子商务支付流程。 ②跨境电子商务支付应用根据应用和用户选择的支付工具,来调用对应的支付产…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的…

SkyEye:助力飞行器状态控制系统仿真

飞行器与常见的航天器一样,属于安全关键领域的大型复杂设备,对安全性、可靠性有着极高的要求。为保证稳定飞行,需要对目标对象进行实时跟踪,通过发出正确的修正偏差指令来操纵飞行器改变飞行姿态,因此对飞行器状态控制…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

ISIS单区域实验简述

ISIS 中间系统到中间系统&#xff0c;也是链路状态协议&#xff0c;工作在数据链路层&#xff0c;不依赖IP地址&#xff1b;与OSPF一样采用最短路径SPF算法&#xff0c;收敛速度快。 实验基础配置&#xff1a; r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 cat /root/..kube/config 查看秘钥 -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIBAgIIGOkRkIVlo74wDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE AxMKa3ViZXJuZXRlczAeFw0yNDAyMDgwNjAwMjdaFw…

王庆:当下股市过于悲观,A股、港股基本完成补跌和普跌过程,逆向布局时机已到

核心观点&#xff1a; 1、房地产对中国经济增长拖累最严重的时期正在过去...密切关注真正拐点的出现。 2、当前资本市场从价格表现上来讲&#xff0c;表现的远远超过了基本面所决定的悲观程度。 由于当前资本市场过于悲观&#xff0c;那么反过来就是孕育着机会。 3、我们判…

快速排序 刷题笔记

思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…

《详解:鸿蒙NEXT开发核心技术》

我们现在都知道鸿蒙作为一个国产的全栈自研系统&#xff0c;经过国家主推后。已经引起人们很大的关注&#xff0c;其中作为开发者来说&#xff1b;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了&#xff0c;目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…

【数据库-黑马笔记】基础-SQL

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看1~26集 MYSQL 的基础知识框架如下 目录 一、MYSQL概述 1、数据库相关概念 2、MYSQL的安装及启动 二、SQL 1、DDL【Data Defination】 2、DML【Data Manipulation】 ①、插入 ②、更新和删除 3、 DQL【Data…

Linux本地搭建FastDFS系统

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

jenkins部署go应用 基于docker-compose

丢弃旧的的构建 github 拉取代码 指定go的编译版本 安装插件 拉取代码是排除指定的配置文件 比如 conf/config.yaml 文件 填写配置文件内容 比如测试环境一些主机信息 等 可以配置里面 构建的时候选择此文件替换开发提交的配置文件。。。。 编写docker-compose 文件 docker…

短视频解析接口分发系统

宝塔面板&#xff1a;Nginx系统 php7.2 Mysql 5.6-5.7 伪静态Thinkphp 上传文件直接访问域名安装即可 可以自备 听说后边要出saas去水印小程序 下载地址&#xff1a;https://pan.xunlei.com/s/VNskSEelfRVIzoSm5P5Rcw34A1?pwdqzhh# 接口演示&#xff1a; 前端演示…

解决ipconfig不是内部或外部命令,也不是可运行的程序或批处理文件

问题所示&#xff1a;ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决办法如下: 1.右击此电脑&#xff0c;点击属性设置&#xff1a; 2.点击高级系统设置 3.点击进入环境变量 4.在系统变量中进行设置&#xff0c;双击PATH进行配置 5.点击新建&am…

2024-Android大厂(字节跳动,腾讯

PS&#xff1a;全文点击蓝色文字&#xff0c;即可跳转链接 【字节面试官&#xff1a;看了3000多份简历&#xff0c;面试1000场后&#xff0c;想给金九银十找工作的程序员几点建议附大厂真题面经】 本文主要介绍校招&#xff0c;上半年疫情原因真正面试的时间和机会也不多&#…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的零售柜商品识别系统对于智能零售领域的进步至关重要。本文深入介绍了如何运用深度学习技术开发此类系统&#xff0c;并分享了全套实现代码。系统采用了领先的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5进行了性能比较&#xff0c;呈现了诸如…

FDU 2021 | 二叉树关键节点的个数

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 给定一颗二叉树&#xff0c;树的每个节点的值为一个正整数。如果从根节点到节点 N 的路径上不存在比节点 N 的值大的节点&#xff0c;那么节点 N 被认为是树上的关键节点。求树上所有的关键节点的个数。请写出程序&#xff0c;并…

最新CLion + STM32 + CubeMX 开发环境搭建

网上有不少相关教程&#xff0c;但都是基于老版本Clion&#xff0c;新版有一些改变&#xff0c;但整体是简单了。 PS&#xff1a;本教程基于CLion 2023.3.4 安装所需工具参考&#xff1a;Clion搭建stm32开发环境&#xff08;STM32F103C8T6&#xff09;&#xff0c;有这一篇就够…