• 自定义模块和第三方模块,cnmp


    目录

    1.模块化简介

    (1) 传统开发项目结构 的 缺陷

    (2)模块化

    (3)模块化的优点

    2.Common.js模块化规则

    3.模块的分类

    4.自定义模块

    5.第三方模块

    npm和包

    npm的相关命令

    npm 生成package.json

    6.配置cnpm

    7.各种模块的加载机制


     

    1.模块化简介

    (1) 传统开发项目结构 的 缺陷

    • 不利于后续维护 和 二次开发(不好管理,项目结构混乱)

    (2)模块化

    • 按照一定的规则 将js代码功能进行封装

    (3)模块化的优点

    • 规范化:由于所有模块 都按照指定的规则进行封装 因此 可以做到格式上的统一

    • 代码复用高

    • 易维护:如果某一个模块除了问题 就只会影响到使用该模块的功能 不影响其他功能 而且 解决问题的时候 也方便定位

    2.Common.js模块化规则

    • 这个模块化规则 是node中 使用的规则

      • 模块js文件中 通过exports/module.exports 暴露数据/变量

      • 在哪个js文件中 需要使用这些数据 就在哪个js文件中 引入该模块 即可 require

    3.模块的分类

    • 内置模块

    • 自定义模块(见上一篇)

    • 第三方模块

    4.自定义模块

    • 自定义模块 就是我们自己封装 模块js文件

      1. //1.编写模块js代码
      2. //封装函数 通过函数编写各种功能
      3. let fn1 = ()=>{....};
      4. let fn2 = ()=>{....};
      5. ....
      6. //2.将功能函数 暴露出去
      7. //我们可以通过module.exports将数据暴露出去
      8. //module.exports本身是一个 对象 我们可以通过给他添加属性和方法的方式 将数据暴露出去
      9. //本质上 模块js文件 暴露的 就是module.exports
      10. module.exports.fn1 = fn1
      11. module.exports.fn2 = fn2
      12. ...
      13. //我们也可以专门暴露某一个指定数据
      14. //单个暴露
      15. //本质上 模块js文件 暴露的 就是module.exports
      16. module.exports = 要暴露的数据
      17. //exports
      18. //我们还可以使用 exports 来暴露模块数据 但是 这种方式只能批量暴露 不能单个暴露
      19. //批量暴露 和 module.exports的暴露方式相同
      20. //就是将 要暴露的数据 作为属性或方法 添加给exports 即可
      21. exports.fn1 = fn1;
      22. exports.fn2 = fn2;
      23. ....
      24. //exports 本质是一个变量 let exports = module.exports
      25. //module.exports本质上是一个对象 因此 exports 是由 module.exports直接赋值的 因此二者会互相影响
      26. //因此 我们给exports添加属性 就相当于 给 module.exports 添加属性
      27. //exports不能像module.exports一样 单个暴露数据
      28. //因为 exports是一个变量 其值为 module.exports
      29. //let exports = module.exports
      30. //因此 如果想像module.exports一样单个暴露数据 就会写作:exports = 要暴露的数据
      31. //这样写 exports 就和 module.exports毫无关系了 因此也就暴露不了了

    • 模块暴露数据的方式有三种
      • 单个暴露——一种

        • module.exports = 要暴露的数据

      • 批量暴露——两种

        • module.exports.属性名/方法名 = 要暴露的数据

        • exports.属性名/方法名 = 要暴露的数据

    • 引入模块js中暴露的数据的方式 两种

      • let 变量 = require("模块名/路径")

      • let {变量名1,变量名2,...} = require("...")

     

    5.第三方模块

    npm和包

    • npm:node package manager node的包管理工具

      • 我们如果想使用第三方模块 需要单独对模块进行下载和安装 下载安装的操作 就由npm来完成

      • npm 已经内置到了 node安装包中 因此 我们安装node之后 就会捆绑安装npm

      • 在cmd命令行中 我们可以通过 npm -v命令 检测我们安装的npm的版本

    • npm的作用

      • 1.下载并安装第三方模块包

      • 2.管理本地的模块包

    • 我们下载第三方模块包 都是从 npm官网进行下载——npm

    npm的相关命令

    • 下载并安装第三方模块——npm install 模块包名 / npm i 包名 默认安装方式 安装的就是产品依赖

    • 下载并安装指定版本的模块——npm i 包名 @版本号

    • 下载开发依赖—— npm install 包名 --save-dev / npm i 包名 -D

    • 下载产品依赖—— npm install 包名 --save / npm i 包名 -S

    • 注意:当我们在项目文件夹中 第一次安装第三方模块包的时候 就会自动生成一个文件夹——node_modules 和 一个文件 package-lock.json

      • node_modules文件夹:用来存放 我们下载安装的模块包 以及 其所依赖的模块包

      • package-lock.json文件:用来 记录我们下载安装过的 模块包 的相关信息

    • 卸载第三方模块包:npm uninstall 模块包名 / npm r 包名

    • 全局安装:npm i 包名 -g

      • 全局安装的模块包 在任何路径下 都可以使用

      • 非全局安装的模块包 只能在自己的项目文件夹中使用

      • 下面 我们以 nodemon模块 来演示

        • nodemon模块 是 node代码运行的热更新 工具

        • 1.在cmd中 输入 npm i nodemon -g

        • 2.全局安装的模块包 会保存在 C:\Users\Administrator\AppData\Roaming\npm\node_modules

        • 3.我们需要先检查一下 环境变量 如果环境变量Path中 有上述值,我们就可以直接使用了 如果没有 需要我们自己写入

          • 控制面板--->系统--->高级系统设置--->环境变量--->配置Administrator的Path变量

          • 就是将C:\Users\Administrator\AppData\Roaming\npm\node_modules 添加到path中即可

          • 注意:path中各个路径之间 要使用 分号隔开

          • C:\Users\Administrator\AppData\Roaming\npm;C:\Users\Administrator\AppData\Roaming\npm\node_modules

        • 4.测试 能不能在任意文件夹 使用nodemon

        • nodemon的用法

          • 在执行js文件的时候 我们可以使用nodemon命令——nodemon 文件名

          • 这样执行的js文件 会实现 热更新、

        • 在cmd命令行工具中 结束命令的快捷键 是 ctrl+c

    • 全局卸载:npm r 包名 -g

      • 卸载的是 C:\Users\Administrator\AppData\Roaming\npm\node_modules中的模块包

    npm 生成package.json

    • 生成命令:npm init / npm init -y

      • npm init : 需要我们手动进行确认

      • npm init -y:自动生成 不需要确认 所有参数都是用默认值

    • 当我们执行 npm init命令后 会要求我们确认以下信息

      • package name: 默认值为当前项目文件夹名

        • 注意:不能设置为中文

      • version:版本号 默认 1.0.0

      • description:项目描述信息

      • entry point:入口文件 可以自行设置

      • test command:测试命令 可以手动配置 我们不在这里配置

      • git repository:git远程仓库地址

      • keywords:关键词

      • author:作者

      • license:协议

      1. //生成好的package.json 内容如下
      2. {
      3.  "name": "allens-program",//项目包名
      4.  "version": "1.0.0",//项目版本号
      5.  "description": "this is allen's project",//项目描述信息
      6.  "main": "01-test.js",//项目入口文件
      7.  "dependencies": {
      8.    "trim": "^1.0.1"//当前项目中 安装的 模块包
      9. },
      10.  "devDependencies": {},//当前项目中 安装的 开发依赖 模块包
      11.  "scripts": {//scripts属性中 存放的是 当前项目中 所有可以使用的命令 这些命令的用法为:npm run 命令名
      12.      //但是 如果我们配置命令名为start 的命令 则可以直接写 npm start
      13.    "test": "echo \"Error: no test specified\" && exit 1"
      14. },
      15.  "author": "allen",//作者
      16.  "license": "ISC"//协议
      17. }

    • 注意:json文件的编写规则

      • 在json文件的对象中 属性名 必须加 双引号

      • 数组和对象 最后一个成员 后面都不能加 逗号

      • 一个json文件中 只能写一个数据

      • json文件中不能写注释

    单独说明

    • scripts:用来配置 项目中的快捷命令 我们可以通过配置快捷命令的方式来实现代码的快速开发

      •   "scripts": {//scripts属性中 存放的是 当前项目中 所有可以使用的命令 这些命令的用法为:npm run 命令名
              //但是 如果我们配置命令名为start 的命令 则可以直接写 npm start
            
        

    6.配置cnpm

    作用:cnpm 可以在网速不好的时候 帮助我们下载第三方模块 更快捷

    • 原因:npm下载模块 是从境外服务器上 因此 速度慢 cnpm 下载模块 是从 国内服务器(淘宝镜像上) 因此速度更快

    • 如果网速不好的时候 简易配置cnpm

    • 配置命令

    • 配置cnpm:npm install -g cnpm@指定版本 --registry=https://registry.npm.taobao.org

      • 注意:如果是nodev12版本 需要使用6版本的 cnpm 版本如果出问题 会导致报错 如果是最新稳定版node 就可以使用最新版本的cnpm

      • 配置npm的下载源:npm config set registry https://registry.npm.taobao.org
    • cnpm命令 和 npm命令 完全相同 只是将npm 改为了 cnpm

    7.各种模块的加载机制

    • 内置模块包的加载机制

      • 内置模块的优先级最高 会优先加载

      • 具体体现

          1. let fs = require("fs");
          2. //如果我们这时 下载了一个第三方模块 也叫 fs 这里引入的fs模块 就一定是 内置的fs模块

    • 自定义模块的加载机制

      • 自定义模块的引入:let 变量 = require("相对路径")

      • 使用require()加载自定义模块时,必须指定以./或../开头 如果没有指定./或../这样的路径标识符,则Node.js会把它当作内置模块或第三方模块进行加载。

        • //假设自定义模块 就写在当前文件夹中
          let 变量名 = require("./模块名")
      • 自定义模块不要放在node_modules中。

        • 注意:我们在编写node代码的时候 不要动node_modules文件夹

      • 在引入自定义模块的时候 可以省略其后缀名

        • 原因:如果我们省略了后缀名 node会执行如下操作

          • 1.默认给我们补充.js后缀名 进行查找 如果找到了 就引入 如果没找到

          • 2.就继续给我们重新替换后缀名为.json 继续进行查找 如果找到了,就引入json文件 如果还没找到

          • 就报错 cannot find module "xxx"

    • 第三方模块加载机制

      • 1.先在当前文件夹的node_modules文件夹中 查找第三方模块 如果找到 就直接引入并使用

      • 2.就向上一级父文件夹中的node_modules文件夹中 查找模块 如果有 就直接引入 如果还没有 就继续向上一级父文件夹查找 一直查找到 根目录 如果有就可以引入 如果到根目录还没有

      • 3.去环境变量中 配置过的路径中 查找其中的node_modules文件夹 如果有模块 就可以引入 如果还没有 就报错cannot find module "xxx"

  • 相关阅读:
    windows10环境下的RabbitMQ详细安装步骤(图文)
    网络设备和网络软件
    前端基础(四十五):你不知道的JavaScript - 解构、函数默认传参、类super、模板字面量、生成器提前完成、集合、新增API
    jmeter接口测试及详细步骤以及项目实战教程
    商场做小程序商城的作用是什么?
    1.1 熟悉x64dbg调试器
    对无符号数和%u打印的了解
    如何系统的学习Python——Python的基本语法
    平时积累的FPGA知识点(7)
    推荐系统类别特征的embedding
  • 原文地址:https://blog.csdn.net/weixin_64037609/article/details/127419398