nodeJS模块化开发

2023-05-16

1、模块的使用

1.1、为什么要模块化(了解)

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。(一个js文件就是一个模块)

使用模块有什么好处:

  • 最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Node.js 内置的模块和来自第三方的模块。

  • 使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。

说重点:主要的原因是方便项目的开发和维护

1.2、模块规范的定义(了解)

  1. 一个js文件就是一个模块,模块的作用域是私有的,内部定义的变量或者函数,只在当前的文件(模块)可以使用

  2. 如果别人需要使用我们模块里面的东西,那么有两点要做(以CommonJS 的 Modules 规范: Node.js为例)

    1. 自己编写的模块,由于模块作用域是私有的,默认情况下,外部是没办法使用的;如果希望别人可以使用,则需要导出 exports 或者 module.exports。 导出的时候,以对象的方式进行导出

    2. 别人要使用某个模块,则需要先引入该模块,使用 require 引入,引入后需要使用一个变量来接收导入的对象。

对书写格式和交互规则的详细描述,就是模块定义规范(Module Definition Specification):

  • AMD 规范: Require.js

  • CMD 规范: Sea.js

  • CommonJS 的 Modules 规范: NodeJs

  • ES6 模块化规范 import ... from ...

1.3、模块化使用

导出数据方式一:


exports.num = num;
exports.sum = sum;
exports.Animal = Animal;  

导出数据方式二:


// 通过module.exports 等于一个对象,来导出数据
// 对象可采用es6简化对象的写法
module.exports = {
    num,
    sum,
    Animal
};  

导入数据:


 注意1: 如果要使用某个模块里面的数据,则需要使用 require 关键字进行导入。
 注意2:在导入用户自己开发的模块的时候,需要加上路径(1. 相对路径(多) 2. 绝对路径) 注意:  必须写上
 注意3:模块文件的扩展名(后缀名)可以写,也可以不写
注意4:导出的模块一般需要使用一个变量来接收,一般把接收的量定义为常量
注意5: 定义常量的名称和文件的名称保持一致(这个不是必须,大家都这么做)
const m1 = require("./modules/m1.js");
​  

完整代码:


// m1.js中:    
let num = 10;
function sum(a, b) {
    return a+b
}
​
class Animal{
    constructor(){
        this.age=0
    }
}
​
// 导出数据方式1:
// exports.num = num;
// exports.sum = sum;
// exports.Animal = Animal;
​
​
// 导出数据方式2:
// 通过module.exports 等于一个对象,来导出数据
// 对象可采用es6简化对象的写法
module.exports = {
    num,
    sum,
    Animal
};
​
​  

//01-模块的使用.js
const m1 = require("./modules/m1.js");
​
​
console.log(m1);   //{ num: 10, sum: [Function: sum], Animal: [Function: Animal] }
console.log(m1.sum(10, 20));
const obj = new m1.Animal();   //30
console.log(obj.age);   //0  

2、模块里面this的指向问题

1、exports实际上是module.exports的引用,

2、exports是module.exports的引用,文件中才有exports,交互模式下没有exports(exports是引用了module.exports对象在文件中存在)

3、在 nodejs 里面的 this 代表当前的这个模块,也就是 exports 对象

4、this也是指向模块/文件导出的对象,因此在文件中(exports===module.exports===this)

5、而在交互环境中则不存在点4的这一等式,一切都来源自module.exports的引用,

6、this===global在交互模式下成立,this===exports在一个模块文件下也是成立的。不同的模式下各自不同

7、exports对象存在数据丢失问题,当我们利用第二种对module.exports进行数据导入方法时exports就存在数据丢失,为此利用第二种方式时需要对获取的数据进行赋值


console.log(exports);   //{}
console.log(module.exports);  //{}
console.log(exports === module.exports);  //true  exports实际上是module.exports的引用
​
console.log('this', this); // this {}
​
console.log(this === exports);// true   // 在 nodejs 里面的 this 代表当前的这个模块,也就是 exports 对象  并且,交互模式下,没有exports这个对象
console.log(global === this );   //false    this不指向全局对象  

3、nodejs常用内置模块

一般项目中模块分为3种,nodejs内置模块、自己书写的模块、第三方模块(使用一个专门的工具npm进行统一管理)

常用的内置模块如下:

  • fs :文件操作

  • http :网络操作

  • path :路径操作

  • querystring :查询参数解析

  • url :url 解析


const fs = require("fs");
const http = require('http');
const path = require('path');
const querystring = require('querystring');
const url = require('url');  

nodejs内置模块的文档网址:API 文档 | Node.js 中文网

3.1、path内置模块


const path = require("path");
​
console.log(__dirname); // 当前执行的文件绝对路径,不包含文件名
​
console.log(__filename);  // 当前执行的文件绝对路径,包含文件名
​
​
let extname = path.extname( __filename );   // 获取扩展名(后缀名)
console.log(extname);
​
let baseName = path.basename( __filename );  // 获取文件名(包含后缀名)
console.log(baseName);
​
let dirname = path.dirname(__filename);   //获取目录(路径)
console.log(dirname);
​
let parse = path.parse(__filename);  //获取路径字符串的对象
console.log(parse);
​
//路径的拼接操作 join
// join 默认相对路径的拼接 ,以当前操作系统路径分割符进行拼接
let fullPath1 = path.join('path.js');
// fullPath1 = path.join(__dirname,'path.js'); //带目录
// fullPath1 = path.join(__dirname,'a','path.js'); //带多级目录
console.log(fullPath1);  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nodeJS模块化开发 的相关文章

随机推荐

  • 初识jquery

    jQuery 入口函数 1 function 2 document ready function 注意 xff1a 等着DOM结构渲染完毕即可执行内部代码 xff0c 不必等到所有外部资源加载完成 xff0c jQuery帮我们完成了封装
  • jQuery基础(二)

    xff1a eq获取到的索引号的index从0开始因此eq 2 是标签的第三个标签 选择器筛选 function 34 nav gt li gt a 34 mouseover function this siblings 34 ul 34
  • Thinkphp开启项目分组,绑定二级域名

    如果发现没有效果 xff0c 请开启debug xff0c 清除缓存
  • 链式编程+jQuery中html( )和text( )方法

    事件切换的复合属性写法 xff1a 标签名 hover function 执行函数 function 执行函数 xff0c 这一个方法仅hover可用 jQuery中有个动画队列的机制 xff1a 当我们对一个对象添加多次动画效果时后添加的
  • jQuery动态创建元素,通过元素操作修改购物车相关交互效果

    1 创建元素 语法 34 39 lt li gt lt li gt 34 动态的创建了一一个 lt li gt 2 添加元素 内部添加元素 生成之后 它们是父级关系 外部添加元素 生成之后 他们是兄弟关系 1 内部添加 把内容放入匹配元素内
  • jQuery 尺寸、位置操作

    1 width height 获取设置元素 width和height大小 console log 34 div 34 width 34 div 34 width 300 2 innerWidth innerHeight 获取设置元素 wid
  • jQuery侧边导航栏模块交互效果,导航栏点击事件、卷动事件、节流阀

    任务分析 xff1a 当我们滚动到模块 xff0c 就让电梯导航显示出来点击电梯导航页面可以滚动到相应内容区域核心算法 因为电梯导航模块和内容区模块 对应的当我们点击电梯导航某个小模块 xff0c 就可以拿到当前小模块的索引号 xff0c
  • jQuery学习周记

    周记 本周主要跟着教学视频制作了商城购物车案例 xff0c 页面电梯导航 xff0c 学习了利用jQuery操作尺寸 位置的操作 xff0c 这一部分就类似于JS中的BOM页面文档类型 xff0c 主要是通过对页面卷动事件进行一系列操作 其
  • jQuery自动触发事件与bootstrap/jQuery插件用法

    jQuery自动触发事件 有些事件希望自动触发 比如轮播图自动播放功能跟点击右侧按钮一致 可以利用定时器自动触发右侧按钮点击事件 xff0c 不必鼠标点击触发 语法 xff1a 1 element click 2 element trigg
  • 初识AJAX基础(一)

    1 初识AJAX 1 概要 google suggest A xff1a 通过发送请求到服务器上获取相关数据 B xff1a 发送方式 xff1a 通过URL 超链接 表单验证 C xff1a 将请求的数据发送给服务器获得相关数据 它是浏览
  • 使用nvm切换node方法,以及在nvm中的注意事项

    利用nvm随意下载nodejs版本 使用nvm去切换nodejs版本过程中出现的乱码情况分析 1 nvm安装路径错误导致nodejs下载路径有误 xff0c 无法正常打开 xff08 建议删除 xff0c 重新安装时使用默认路径安装 xff
  • nodejs中对es6语法规范讲解

    1 var的弊端及let关键字 1 var声明的变量有预解析 xff08 变量提升 xff09 xff0c 造成 逻辑混乱 xff0c 可以先使用 xff0c 后声明 2 var可以重复定义同一个变量 xff0c 逻辑错误 xff0c 第二
  • nodejs中解构语法

    1 解构语法 1 对象解构 存在意义 xff1a 简化代码 注意点 xff1a 1 在进行完全解构时 xff0c 属性值内花括号中的属性值的顺序可以随意颠倒 2 解构之后起重命名 let name itsName 61 obj 解构之后重命
  • 使用pt-query-digest分析mysql

    最近在看 高性能MySQL xff0c 作者们背靠Percona向我展示了以前从不知道的一些关于MySQL的知识以及各种分析优化工具 xff0c 比如这里要说的pt query digest 什么是pt query digest pt qu
  • node.js对es6语法学习

    1 es6模板字符串的使用 xff08 模板语法 xff09 console log 96 obj newname 是 obj name 的另外一个名字 xff0c 还有就是她今年18岁啦 96 es6 提供一个语法表示一个字符串 xff0
  • ES6中的箭头函数

    1 箭头函数 ES6 允许使用 箭头 xff08 61 gt xff09 简化函数的定义 注意点 xff1a 1 形参个数如果为1个 xff0c 可以省略小括号不写 2 如果函数体里面只有一个语句 xff0c 可以省略大括号不写 并且他会默
  • ES6this指向丢失问题+利用class类创建对象

    1 在dom操作中使用箭头函数可以规避this指向丢失问题 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 g
  • nodeJS继承中的子类constructor的写法+静态属性和静态方法+nodejs中的全局对象

    1 继承中的子类constructor的写法 xff1a 在ES6中使用继承时 xff0c constructor中必须调用super 方法 其本质是在调用父类的constructor方法 通过这样的方式来达到属性继承的效果 xff0c 解
  • ES6中process对象

    process对象 了解 console log process argv 返回一个数组 xff0c 前两个值是 node 命令所在位置 xff0c 被执行 JS 文件的路径 xff0c 若你执行命令时还有带有参数 xff0c 依次会填充到
  • nodeJS模块化开发

    1 模块的使用 1 1 为什么要模块化 了解 在计算机程序的开发过程中 xff0c 随着程序代码越写越多 xff0c 在一个文件里代码就会越来越长 xff0c 越来越不容易维护 为了编写可维护的代码 xff0c 我们把很多函数分组 xff0