【Node】CommonJs(cjs)

2024-02-25 05:38
文章标签 node commonjs cjs

本文主要是介绍【Node】CommonJs(cjs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CommonJs

  • CommonJs 是 Node 的模块化规范
  • 在 Node 中,每个文件都是独立的模块
  • 在 Node 中,有一个全局对象 global (与网页中的 window 类似)
    全局作用域下创建的变量,会成为 global 的属性
    全局作用域下创建的函数,会成为 global 的方法
  • 模块内的变量不在全局作用域中,模块存在自己的作用域(相当于在一个函数内),所以不能随意调用模块之间的变量
let num = 0;
console.log(num, global.num); // 0 undefined
  • 创建全局变量:不用关键字声明(不推荐)
num = 0;
console.log(num, global.num); // 0 0
  • 实际上,Node 模块的代码都是包装在一个函数中的,并且函数在执行时,接收了 5 个实参,可通过 arguments 查看:
console.log(arguments);
[Arguments] {'0': {}, // module.exports 的引用,用于导出数据'1': [Function: require] {...}, // require 函数,用于导入数据'2': Module { // 当前模块 modulepath: 'e:\\node.js\\code\\newDemo\\js', // 当前模块所在目录的路径exports: {}, // module.exports 对象,用于导出数据filename: 'e:\\node.js\\code\\newDemo\\js\\operation.js', // 当前模块的路径// ...},'3': 'e:\\node.js\\code\\newDemo\\js\\operation.js', // 当前模块的路径'4': 'e:\\node.js\\code\\newDemo\\js' // 当前模块所在目录的路径
}
  • 接收这 5 个实参的形参:(exports, require, module, __filename, __dirname) => {}
    1. exports:用于导出数据;默认为空对象;是 module.exports 的引用
    2. require:用于导入数据;是一个函数,返回 [被导入模块所导出的数据],即 [被导入模块的 module.exports]
    3. module:代表当前模块,存有与当前模块相关的信息
    4. __filename:当前模块的路径
    5. __dirname:当前模块所在目录的路径
console.log("module.exports", module.exports); // module.exports {}
console.log("require", require); // require [Function: require] { …… }
console.log(exports === module.exports); // true
console.log("__filename", __filename); // __filename e:\node.js\code\newDemo\js\operation.js
console.log("__dirname", __dirname); // __dirname e:\node.js\code\newDemo\js



require - 导入数据

  • require('文件标识'),返回 [被导入模块所导出的数据],即 [被导入模块的 module.exports]
  • 模块分 3 大类:核心模块、自定义模块、第三方模块
    ① 核心模块:Node 的内置模块,模块标识是 模块名
    ② 自定义模块:用户自己创建的模块,模块标识是 文件路径
    ③ 第三方模块:需要手动下载;模块标识是 模块名
  • 模块查找顺序:
    ① 核心模块:require('fs')
    ② 自定义模块:require('./cjs1') ( 可以不写后缀!!! )
    会先按照确切的文件名进行加载 → 补全 .js 进行加载 → 补全 .json 进行加载 → 补全 .node 进行加载
    ③ 第三方模块:require('mysql')
    会到同级的 node_modules 目录中寻找 mysql 目录,找不到则往上一级的 node_modules 目录找
    在 mysql 目录下,找到 package.json 中的 main 字段,读取入口文件
    如果没有 package.json,或者 main 字段 [入口不存在] / [无法解析],则 node 会找该目录下的 index.js


module.exports - 导出数据

① 将需要导出的数据赋值给 module.exports → module.exports = 数据
  • 导出一个数据:
/* cjs1.js */
console.log("cjs1.js");
module.exports = 10; // 导出一个数值
/* cjs2.js */
const num = require("./cjs1"); // 导入数据
console.log("cjs1", num); // cjs1 10

导入时,会先执行一遍 [被导入文件] !!!所以上例的输出顺序为 cjs1.js - cjs1 10

  • 导出一个函数:
/* cjs1.js */
// 导出一个函数
module.exports = function showNum() {console.log("num");
};
/* cjs2.js */
const fun = require("./cjs1"); // 导入函数
console.log("cjs1", fun); // csj1 [Function: showNum]

导出匿名函数:

/* cjs1.js */
// 导出一个匿名函数
module.exports = function () {console.log("num");
};
/* cjs2.js */
const fun = require("./cjs1");
console.log("cjs1", fun); // cjs1 [Function (anonymous)]

导出箭头函数:

/* cjs1.js */
// 导出一个箭头函数
module.exports = () => {console.log("num");
};
/* cjs2.js */
const fun = require("./cjs1");
console.log("cjs1", fun); // cjs1 [Function (anonymous)]
  • 导出一个对象:
/* cjs1.js */
function showNum() {console.log("num");
}
let num = 10;
module.exports = {cjs1ShowNum: showNum,cjs1Num: num,
};
/* cjs2.js */
const cjs1 = require("./cjs1");
console.log("cjs1", cjs1); // cjs1 { cjs1ShowNum: [Function: showNum], cjs1Num: 10 }

导出时可配合 [对象属性的简写]:

/* cjs1.js */
function showNum() {console.log("num");
}
let num = 10;
module.exports = { showNum, num }; // 属性名与变量名一样时,可以省略属性名不写
/* cjs2.js */
const cjs1 = require("./cjs1");
console.log("cjs1", cjs1); // cjs1 { showNum: [Function: showNum], num: 10 }

导入可配合 [解构赋值]:

/* cjs2.js */
const { showNum, num } = require("./cjs1.js");
console.log("showNum", showNum); // showNum [Function: showNum]
console.log("num", num); // num 10

② 将需要导出的数据设置为 module.exports 的属性:module.exports.数据名 = 数据值
/* cjs1.js */
let num = 10; // 定义一个变量
module.exports.cjs1Num = num; // 导出这个变量// 定义一个函数
function showNum() {console.log("num");
}
module.exports.cjs1ShowNum = showNum; // 导出这个函数
/* cjs2.js */
const cjs1 = require("./cjs1");
console.log("cjs1", cjs1); // cjs1 { cjs1Num: 10, cjs1ShowNum: [Function: showNum] }



exports - 导出数据

  • 将需要导出的数据设置为 exports 的属性:exports.数据名 = 数据值
/* cjs1.js */
let num = 10; // 定义一个变量
exports.cjs1Num = num; // 导出这个变量// 定义一个函数
function showNum() {console.log("num");
}
exports.cjs1ShowNum = showNum; // 导出这个函数
/* cjs2.js */
const cjs1 = require("./cjs1");
console.log("cjs1", cjs1); // cjs1 { cjs1Num: 10, cjs1ShowNum: [Function: showNum] }



module.exports & exports

  • 文件导出的是 module.exports,而 exportsmodule.exports 的引用

    ∴ 直接给 exports 赋值是修改不了 module.exports

    ∴ 通过直接赋值导出的操作,只能由 module.exports 完成,不能使用 exports

/* cjs1.js */
function showNum() {console.log("num");
}
let num = 10;
exports = { showNum, num };
/* cjs2.js */
const cjs1 = require("./cjs1.js");
console.log("cjs1", cjs1); // cjs1 {}

可以看到导入的是空对象 {},即什么数据都没获取到

  • 如果多次使用 module.exports 通过直接赋值导出数据,后面的会覆盖前面的
/* cjs1.js */
let num = 10;
module.exports = { num }; // 给 module.exports 赋值
function showNum() {console.log("num");
}
module.exports = { showNum }; // 再给 module.exports 赋值
/* cjs2.js */
const cjs1 = require("./cjs1.js");
console.log("cjs1", cjs1); // cjs1 { showNum: [Function: showNum] }

同理,如果我们先给 module.exports 设置属性,然后又对 module.exports 赋值,则导出的是赋值给 module.exports 的数据!

/* cjs1.js */
let num = 10;
module.exports.num = num; // 给 module.exports 设置属性
function showNum() {console.log("num");
}
module.exports = { showNum }; // 再给 module.exports 赋值
/* cjs2.js */
const cjs1 = require("./cjs1.js");
console.log("cjs1", cjs1); // cjs1 { showNum: [Function: showNum] }



模块化 demo

思路:[ 数据 ]、[ 方法 ]、[ 逻辑处理 ] 分开放置

/* data.js */
let dataObj = {name: "superman",age: 21
}
module.exports = dataObj;
/* function.js */
function showName(obj) {console.log('my name is ' + obj.name);
}
module.exports = showName;
/* operation.js */
let showName = require('./function.js');
let dataObj = require('./data.js');
showName(dataObj); // my name is superman



ESModule(esm)



这篇关于【Node】CommonJs(cjs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744536

相关文章

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

在Debian 8上安装Node.js的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Node.js 是一个通用编程的 JavaScript 平台,允许用户快速构建网络应用程序。通过在前端和后端都使用 JavaScript,开发可以更加一致,并且可以在同一个系统中设计。 在本指南中,您将在 Debian 8 服务器上安装 Node.js。Debian 8 包含一个版本的

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

Node.js学习记录(一)

目录 一、文件读取 readFile 二、写入文件 writeFile 三、动态路径 __dirname:表示当前文件所处的目录、path.join 四、获取路径文件名 path.basename 五、提取某文件中的css、JS、html 六、http 七、启动创建web服务器 服务器响应 八、将资源请求的 url 地址映射为文件的存放路径 九、模块 模块加载 模块作用域

ubuntu安装node的问题

初学node,按照书上的流程安装nodejs,当安装canvas的时候(npm install canvas)遇到问题 node-gyp rebuild 然后就卡住了,查了下,基本上就是各种依赖问题,几经折腾就在要放弃的时候,终于在网上发现node官方wike https://github.com/Automattic/node-canvas/wiki/Installation---Ubun

node快速复制文件或文件夹,排除部分文件(node_modules)

const fs = require('fs')const path = require('path')/*** @description: 获取完整的文件路径* @param {*} url 路径* @return {*} 返回完整的文件路径*/const getPath = (url) => {return path.join(__dirname, url)}/*** @descr

Node.js和vue3实现GitHub OAuth第三方登录

Node.js和vue3实现GitHub OAuth第三方登录 前言 第三方登入太常见了,微信,微博,QQ…总有一个你用过。 在开发中,我们希望用户可以通过GitHub账号登录我们的网站,这样用户就不需要注册账号,直接通过GitHub账号登录即可。 效果演示 注册配置 GitHub 应用 1.首先登录你的GitHub然后点击右上角的头像->点击进入Settings页面 2.在