【问题标题】:Migrating a CommonJS 'module.exports = function()' to ESM将 CommonJS 'module.exports = function()' 迁移到 ESM
【发布时间】:2022-07-04 20:41:03
【问题描述】:

我正在使用 NodeJS,并且已经编写 JavaScript 几年了,并且仍在学习。

对于我的 CJS 模块,我编写(我称之为)一个包含所有(我称之为)我的子函数的根函数,然后在根函数上为我想要公开的函数编写 return {subfunction1, subfunction2}。诚然,我从 Jonathan Mills 那里学到了这种写作风格,并对此感到满意。

我正在努力解决如何将其从 CommonJS 正确迁移到 ESM,并且希望在不使用 Class 的情况下这样做。但是,如果 Class 是 ESM 的正确方式,那么我会适应。

这是一个 CJS 服务:

service.js

function WebexService(webex) {
  async function processMessage(messageData) {
    try {
      const user = await webex.people.get(messageData.personId);
      //debug(user);
      sendMessage({ displayName: user.displayName, roomId: messageData.roomId });
    } catch (error) {
      debug(error);
      throw error;
    }
  }
  function sendMessage(messageInfo) {
    webex.messages.create({
      roomId: messageInfo.roomId,
      text: `Howdy! ${messageInfo.displayName}`,
    });
  }
  return { processMessage }
}

module.exports = WebexService()

要使用此 CJS 服务,我会将其导入为:

app.js

const { processMessage } = require('../services/webexService');

function superCool() {
  const messageResponse = await processMessage(messageData);
}

我能够让它与 ESM 一起工作的唯一方法是Class

service.js

import debugInit from 'debug';
import chalk from 'chalk';
const debug = debugInit('app:services:webex');

export default class WebexService {
  constructor(webex) {
    this.webex = webex;
  }
  async processMessage(messageData) {
    try {
      const user = await this.webex.people.get(messageData.personId);
      //debug(user);
      this.sendMessage({ displayName: user.displayName, roomId: messageData.roomId });
    } catch (error) {
      debug(error);
      throw error;
    }
  }
  sendMessage(messageInfo) {
    this.webex.messages.create({
      roomId: messageInfo.roomId,
      text: `Howdy! ${messageInfo.displayName}`,
    });
  }
}

app.js

import WebexService from '../services/webex.js';

const WebexServiceInstance = new WebexService(webex);
WebexServiceInstance.processMessage(event.data);

我希望有人能指出我正确的方向。如果有人可以帮我找到要阅读的内容,我很高兴 RTFM。

【问题讨论】:

  • 为什么你的WebexService 需要一个参数,但你没有向它传递任何东西?
  • 康拉德,好问题,我假设您指的是 CJS 示例。对于这个问题,由于这不是我问题的重点,因此假设我正确启动它并将webex 发送到WebexService
  • 我希望你在你的 package.json 中提到了"type":"module"

标签: javascript node.js es6-modules commonjs webex


【解决方案1】:

service.js

function WebexService(webex) {
  async function processMessage(messageData) {
    try {
      const user = await webex.people.get(messageData.personId);
      //debug(user);
      sendMessage({ displayName: user.displayName, roomId: messageData.roomId });
    } catch (error) {
      debug(error);
      throw error;
    }
  }
  function sendMessage(messageInfo) {
    webex.messages.create({
      roomId: messageInfo.roomId,
      text: `Howdy! ${messageInfo.displayName}`,
    });
  }
  return { processMessage }
}

const service = WebexService()
export default service

app.js

import WebexService from '../services/webex.js';
// you can then do this
const { processMessage } = WebexService;
function superCool() {
  const messageResponse = await processMessage(messageData);
}
// or just use it directly
function superCool() {
  const messageResponse = await WebexService.processMessage(messageData);
}

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2020-12-29
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多