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

yizhihongxing

教你彻底搞懂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日

相关文章

  • 无编译/无服务器实现浏览器的CommonJS模块化

    实现浏览器的CommonJS模块化可以采用Browserify、webpack等工具进行打包编译。但是近年来出现了一些无编译、无服务器的方案,如使用ES modules、SystemJS、RequireJS、Browserify、Babel或使用CDN等。下面将详细介绍如何使用SystemJS实现浏览器的CommonJS模块化。 简介 SystemJS是一个…

    node js 2023年6月9日
    00
  • 详解react服务端渲染(同构)的方法

    详解React服务端渲染(同构)的方法 React的服务端渲染(SSR)或同构应用是指将React组件在服务器端进行渲染,将渲染结果发送到客户端,客户端将不再需要JavaScript来根据React组件生成DOM,而直接使用服务器端渲染的结果。同构应用的好处在于可以提高前端应用的性能和SEO。下面将会介绍如何进行React服务端渲染。 1.创建基础项目 首先…

    node js 2023年6月8日
    00
  • JS中队列和双端队列实现及应用详解

    JS中队列和双端队列实现及应用详解 什么是队列? 队列是指一种线性数据结构,它按照先进先出(FIFO)的原则进行排序。队列只允许在后端(称为tail)进行插入操作,在前端(称为head)进行删除操作。例如,当你在一家银行排队等待服务时,由于先来的人先获得服务的原则,所以你必须在队列中等待,直到你到达前面。当有人从银行窗口出来时,他们排在你的前面的所有人都必须…

    node js 2023年6月8日
    00
  • 基于微信签名signature获取(实例讲解)

    下面我将详细讲解“基于微信签名signature获取(实例讲解)”的完整攻略。 什么是微信签名signature 微信签名signature 是一种防止恶意攻击的验证方式。在微信公众号应用中,验证请求来源的正确性是至关重要的。签名signature是由公众号Token、时间戳timestamp和随机字符串noncestr三个参数按照字典序排序后通过SHA1加…

    node js 2023年6月8日
    00
  • 我的Node.js学习之路(一)

    以下是对文中第一部分“我的Node.js学习之路(一)”的完整攻略: 前言 在开始Node.js学习之前,建议先了解前端基础知识(HTML、CSS、JavaScript)。在Node.js中,JavaScript是一门后端编程语言,但许多概念都是与前端有关联的。 安装Node.js 在Node.js的官网(https://nodejs.org/)下载Node…

    node js 2023年6月7日
    00
  • 四叉树有损位图压缩处理程序示例

    四叉树有损位图压缩处理程序示例攻略 简介 四叉树是一种树型数据结构,它将平面划分为四个象限,每个节点都表示一个矩形区域。通过将图像中的每个像素点添加到四叉树中,可以实现对图像的压缩和处理。本文将介绍如何使用四叉树实现有损位图压缩处理程序。 程序实现步骤 将原图像转换为灰度图像; 将灰度图像转换为二值图像; 对于二值图像,将其划分为若干个相等的矩形区域; 对每…

    node js 2023年6月8日
    00
  • 浅谈js promise看这篇足够了

    浅谈JS Promise 介绍 JS Promise是一种规范化的解决异步操作的方案,由于JS具有单线程、异步操作等特点,这使得JS Promise显得更加重要。在这篇文章中,我们将讨论JS Promise并提供示例。我们会通过以下步骤详细介绍JS Promise: Promise概念 Promise状态 Promise如何使用 Promise示例1 Pro…

    node js 2023年6月8日
    00
  • webpack的移动端适配方案小结

    webpack的移动端适配方案小结 了解了Vue/React之后,我们都知道构建工具Webpack,它能够打包、压缩和优化资源,并且通过其插件系统可以支持许多功能。其中之一就是移动端适配方案。在这篇文章中,我们将探讨如何实现Webpack的移动端适配方案。 首先,什么是移动端适配? 移动端的屏幕、设备尺寸、分辨率、浏览器版本等诸多因素会导致 Web 应用的展…

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