教你彻底搞懂ESM与CJS互相转换

教你彻底搞懂ESM与CJS互相转换

在讲解转换之前,我们需要先了解ESM(ECMAScript Modules)和CJS(CommonJS Modules)的基本概念。

ESM和CJS概念

ESM

ESM是一种ECMAScript规范化模块格式,它是ECMAScript 6标准中引入的,它使用import/export关键字进行模块的导入/导出。

示例代码:

// 引入模块
import { sum } from './math.js';

// 导出模块
export function square(num) {
  return num * num;
}

CJS

CJS是一种Node.js中使用的模块化规范,它使用require/module.exports关键字进行模块的导入/导出。

示例代码:

// 引入模块
const math = require('./math.js');

// 导出模块
module.exports = function square(num) {
  return num * num;
}

ESM和CJS互相转换

ESM转换为CJS

在Node.js中使用ESM模块需要进行转换,可以使用babel或者esm等工具进行转换。

使用babel进行转换

安装依赖:

npm install @babel/core @babel/cli @babel/preset-env --save-dev

创建.babelrc文件并配置:

{
  "presets": ["@babel/preset-env"]
}

执行命令:

npx babel src --out-dir lib --extensions ".js" --source-maps inline --ignore node_modules,dist

这里的src是源代码目录,lib是转换后代码目录。

使用esm进行转换

安装依赖:

npm install esm --save-dev

执行命令:

node -r esm app.js

这里的app.js为ESM模块。

CJS转换为ESM

在浏览器或其他支持ESM的环境中使用CJS模块需要进行转换,可以使用rollup、webpack等工具进行转换,这里以rollup为例进行说明。

使用rollup进行转换

安装依赖:

npm install rollup rollup-plugin-commonjs rollup-plugin-node-resolve rollup-plugin-babel @babel/core @babel/preset-env --save-dev

创建rollup配置文件rollup.config.js并配置:

import babel from 'rollup-plugin-babel';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'esm'
  },
  plugins: [
    resolve(),
    commonjs(),
    babel({
      exclude: 'node_modules/**',
      babelrc: false,
      presets: [['@babel/preset-env', { modules: false }]],
      plugins: []
    }),
  ]
}

执行命令:

npx rollup -c

示例

示例一:ESM转换为CJS

源代码:

// src/math.js
export function sum(x, y) {
  return x + y;
}

转换后代码:

// lib/math.js
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.sum = sum;
function sum(x, y) {
  return x + y;
}

示例二:CJS转换为ESM

源代码:

// src/math.js
function add(x, y) {
  return x + y;
}

module.exports = add;

转换后代码:

// dist/bundle.js
function add(x, y) {
  return x + y;
}

export default add;

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:教你彻底搞懂ESM与CJS互相转换 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • 深入理解Node.js中的进程管理

    深入理解Node.js中的进程管理 Node.js是一种单线程、异步的JavaScript运行环境,但在实际应用中往往需要处理大量并发请求。为了满足这一需求,Node.js提供了多进程管理机制,允许开发者使用多个进程以最大程度地利用服务器资源。本文将介绍Node.js中的进程管理机制以及如何应用它来提升性能。 线程与进程的概念 在开始介绍Node.js的多进…

    node js 2023年6月8日
    00
  • Node.js连接postgreSQL并进行数据操作

    下面是“Node.js连接postgreSQL并进行数据操作”的完整攻略,分为以下几个步骤。 1. 安装依赖 首先需要安装 pg 和 pg-hstore 这两个依赖,它们可以让你在 Node.js 中连接到 PostgreSQL 数据库并进行操作。 npm install pg pg-hstore 2. 连接数据库 在 Node.js 中连接 Postgre…

    node js 2023年6月8日
    00
  • node.js实现登录注册页面

    下面是详细讲解“node.js实现登录注册页面”的完整攻略。 1. 环境搭建 首先需要安装Node.js运行环境和npm包管理器,可以到Node.js官网下载并安装。 安装完成后,进入命令行工具,使用npm安装Express框架和相关的模块: npm install express express-session express-validator body…

    node js 2023年6月8日
    00
  • 解决node终端下运行js文件不支持ES6语法

    问题描述: 当我们在终端运行 js 文件时,经常遇到 ES6 语法不被支持的问题,导致程序无法正常执行。比如在终端上运行以下 ES6 语法的代码时: let a = 1; const b = 2; console.log(a + b); 会报出以下错误: /Users/xxx/Desktop/test.js:1 let a = 1; ^^^ SyntaxEr…

    node js 2023年6月8日
    00
  • 如何解决sass-loader和node-sass版本冲突的问题

    要解决 sass-loader 和 node-sass 版本冲突的问题,需要进行以下步骤: 确认项目中的依赖 首先要确定项目中已经安装的 sass-loader 和 node-sass 版本。可以通过运行下面的命令来查看当前项目中安装的版本号: npm ls sass-loader node-sass 该命令将会输出当前项目中 sass-loader 和 n…

    node js 2023年6月8日
    00
  • 详解nodejs 文本操作模块-fs模块(一)

    首先需要明确一下要讲解的内容,这是一篇关于Node.js的文本操作模块——fs模块的教程,主要分为以下几个部分: 介绍fs模块的主要功能和作用 fs模块的几个常用方法的详细说明 两个示例说明 一、fs模块的主要功能和作用 fs模块是Node.js的一个核心模块,提供了对文件系统进行操作的方法,包括读取文件、写入文件、修改文件、删除文件等,是Node.js中常…

    node js 2023年6月8日
    00
  • 详解es6超好用的语法糖Decorator

    详解ES6超好用的语法糖Decorator 什么是Decorator Decorator是ES7中的新语法,可以被用于修改类和类的方法。它们被称为语法糖,因为它们用一种更简单的方式实现了类似于继承的功能。Decorator在AngularJS中被广泛地使用。 如何实现Decorator 在使用Decorator之前,你需要在你的代码中使用Babel或其他转换…

    node js 2023年6月9日
    00
  • Node.js API详解之 V8模块用法实例分析

    当谈到Node.js的API时,V8模块是一个重要的组件。V8模块提供了操作 JavaScript 代码的能力,并且是Node.js运行时的核心。 下面将会详细讲解V8模块的用法,包括如何使用V8模块来编写高效的代码和如何调试V8代码。 V8模块的基本用法 Node.js中通过V8模块来访问JavaScript引擎V8中的API。V8模块是Node.js中最…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部