Node.js使用自己的模块

Node.js使用自己的模块

1.为什么要使用模块

如果你将全部的代码都写入一个文件中,就很难以维护,模块可以让你隔离作用域,将功能进行拆分,逻辑清晰;并且可以请求的复用代码

2.创建并到处模块(CommonJS)

Node.js原生是采用CommonJS规范,使用module.exports或者exports到处内容

2.1基本语法

  • 首先我们创建也给文件夹,modules;我们之前写了一个替换模块的函数,这个模块我们将提取出来

  • 文件夹创建好之后,我们再modules文件夹下创建一个文件叫replaceTemplate.js,我们将函数复制过去,然后使用module.exports导出

js 复制代码
module.exports = (temp,product) => {
    let output = temp.replace(/{%PRODUCTNAME%}/g,product.productName);
    output = output.replace(/{%IMAGE%}/g,product.image);
    output = output.replace(/{%PRICE%}/g,product.price);
    output = output.replace(/{%FROM%}/g,product.from);
    output = output.replace(/{%NUTRIENTS%}/g,product.nutrients);
    output = output.replace(/{%QUANTITY%}/g,product.quantity);
    output = output.replace(/{%DESCRIPTION%}/g,product.description);
    output = output.replace(/{%ID%}/g,product.id);

   if(!product.organic) {
    output = output.replace(/{%NOT_ORGANIC%}/g, 'not-organic');
} else {
    output = output.replace(/{%NOT_ORGANIC%}/g, '');
}

    return output;
}
  • 我们也可以直接使用exports写法
js 复制代码
exports.replaceTemplate = (temp,product) => {
    let output = temp.replace(/{%PRODUCTNAME%}/g,product.productName);
    output = output.replace(/{%IMAGE%}/g,product.image);
    output = output.replace(/{%PRICE%}/g,product.price);
    output = output.replace(/{%FROM%}/g,product.from);
    output = output.replace(/{%NUTRIENTS%}/g,product.nutrients);
    output = output.replace(/{%QUANTITY%}/g,product.quantity);
    output = output.replace(/{%DESCRIPTION%}/g,product.description);
    output = output.replace(/{%ID%}/g,product.id);

   if(!product.organic) {
    output = output.replace(/{%NOT_ORGANIC%}/g, 'not-organic');
} else {
    output = output.replace(/{%NOT_ORGANIC%}/g, '');
}

    return output;
}

3.导入模块

  • 然后就可以导入我们的模块了
js 复制代码
const replaceTemplate = require('./modules/replaceTemplate')
  • 如果你是使用exports的方式来导出模块的,你需要使用将其解构出来
js 复制代码
const {replaceTemplate} = require('./modules/replaceTemplate')

需要解构的原因就是,exports的本质是返回的是这个modules.exports的对象,所以需要将这个属性解构出来

  • 之后会测试一切功能都正常

注意点

  1. 如果你引入没有写任何的扩展,例如const {replaceTemplate} = require('./modules/replaceTemplate'),它会以此尝试replaceTemplate.js,replaceTemplate.json,replaceTemplate.node;
  2. 如果你引入的是一个目录,那么它会自动的寻找该目录下的package.json中的main字段或者直接寻找index.js这个文件;
  3. 每个模块只在第一次require时执行缓存机制,这个特点可能会在你多个文件分享同一个对象的状态的发生错误;
  4. 在模块内部定义的变量是私有的,不会污染全局变量;
  5. 尽量不要设计循环依赖,例如A引入B,B又引入A的这种设计,Node.js 会返回一个尚未执行完毕的不完整导出对象,这种需求最好使用一个第三方公共模块;

4.从Node.js12开始,可以使用ES模块的导入方式

  • 命名导出
js 复制代码
export function replaceTemplate(temp,product) {
    let output = temp.replace(/{%PRODUCTNAME%}/g,product.productName);
    output = output.replace(/{%IMAGE%}/g,product.image);
    output = output.replace(/{%PRICE%}/g,product.price);
    output = output.replace(/{%FROM%}/g,product.from);
    output = output.replace(/{%NUTRIENTS%}/g,product.nutrients);
    output = output.replace(/{%QUANTITY%}/g,product.quantity);
    output = output.replace(/{%DESCRIPTION%}/g,product.description);
    output = output.replace(/{%ID%}/g,product.id);

   if(!product.organic) {
    output = output.replace(/{%NOT_ORGANIC%}/g, 'not-organic');
} else {
    output = output.replace(/{%NOT_ORGANIC%}/g, '');
}

    return output;

}
  • 导入
js 复制代码
import {replaceTemplate} from './modules/replaceTemplate.mjs'

注意:

1.使用ES模块,你必须将所有原先的js文件,该为mjs文件,以告诉node这个是使用ES模块的模式;

2.改为mjs之后,你的fs模块、url模块都需要使用import方式来引入,不能再使用require的方式来引入了!

相关推荐
凌云拓界3 小时前
文件管理:让AI安全操作你的电脑 ——CogitoAgent开发实战(三)
javascript·人工智能·架构·开源·node.js
凌云拓界3 小时前
联网能力:让AI看见更广阔的世界 ——CogitoAgent开发实战(四)
javascript·人工智能·架构·node.js·创业创新
凌云拓界12 小时前
状态机与思考循环 ——CogitoAgent开发实战(一)
javascript·人工智能·架构·node.js·设计规范
winfredzhang14 小时前
用 Node.js + SQLite + 原生前端写一个本地情绪急救 Web App:情绪降落伞 Mood Parachute
前端·sqlite·node.js·express·情绪管理
不好听61315 小时前
Bun vs Node.js:谁才是 TypeScript 的"亲爹"?
typescript·node.js·bun
矩阵科学15 小时前
Langchain.js 实战四:工具的使用
langchain·node.js
前端双越老师17 小时前
2026 年从 0 开发 AI Agent 需要的 10 个技能
node.js·agent·ai编程
夜雪闻竹17 小时前
版本管理:npm 发布 + Electron 打包 + CI/CD
ci/cd·npm·node.js·代码规范·chatcrystal
winfredzhang1 天前
Node.js + SQLite 实战:本地 Markdown 阅读书架源码深度解析
sqlite·node.js·safari·分页·多媒体·md文档
码云之上1 天前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js