前端工程化cjs umd esm 打包差异详解

前端工程化是指在前端项目开发中,通过使用现代化的工具和流程来提高项目的开发效率、可维护性、可扩展性和可靠性。其中,打包是前端工程化的重要部分之一,而 cjs、umd 和 esm 则是不同的打包方式。

cjs、umd 和 esm 的区别

cjs(CommonJS)

CommonJS 是 Node.js 中用于模块化编程的规范。cjs 规范的模块化方式是同步加载,即在应用程序启动时,所有需要用到的模块都会被加载到内存中。在浏览器中,为了使用 cjs 规范的模块,需要使用类似于 Browserify 这样的工具将其编译为可以在浏览器中使用的代码。

// 引入模块
const moduleA = require('./moduleA');
const moduleB = require('./moduleB');

// 使用模块
moduleA.doSomething();
moduleB.doSomethingElse();

umd(Universal Module Definition)

UMD 是一种同时支持 CommonJS 和 AMD 规范的打包方式。UMD 会检测当前环境是使用的 CommonJS 还是 AMD 规范,然后选择对应的模块化方式来导出模块。如果当前环境既不支持 CommonJS,也不支持 AMD,那么 UMD 将会将模块导出至全局变量,以确保它可以在任何地方访问。

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(['dep1', 'dep2'], factory);
  } else if (typeof exports === 'object') {
    module.exports = factory(require('dep1'), require('dep2'));
  } else {
    root.returnExports = factory(root.dep1, root.dep2);
  }
}(this, function (dep1, dep2) {
  // 模块代码
}));

esm(ECMAScript modules)

ESM 是 ECMAScript 2015 中新增的一种模块化规范,支持异步加载和动态导入。ESM 可以在现代浏览器和 Node.js 环境中直接使用,也可以通过使用工具如 Babel 将其转换为 CommonJS 或 AMD 规范的代码。

// 导出模块
export function doSomething() {
  // ...
}

// 引入模块
import { doSomething } from './module';

打包差异详解

在实际项目中,一个模块可能包含多个功能函数,需要以不同的方式导入导出。下面以一个模块为例,分别演示 cjs、umd 和 esm 规范下的打包方式。

cjs 打包

const fs = require('fs');

// 导出函数
module.exports = {
  functionA: function() {
    // ...
  },
  functionB: function() {
    // ...
  },
};

// 导入函数
const moduleA = require('./moduleA');
moduleA.functionA();

在 cjs 规范下,导出函数使用 module.exports,导入函数使用 require()。由于 cjs 是同步加载模块,因此不能动态导入模块。在浏览器中使用 cjs 规范时,需要使用类似于 Browserify 的工具将其编译为可以在浏览器中使用的代码。

umd 打包

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(['exports'], factory);
  } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
    factory(exports);
  } else {
    factory((root.myModule = {}));
  }
}(typeof self !== 'undefined' ? self : this, function(exports) {
  // 导出函数
  exports.functionA = function() {
    // ...
  };
  exports.functionB = function() {
    // ...
  };
}));

在 umd 规范下,导出函数使用 exports,导入函数使用 require() 或者 import。UMD 可以同时支持 CommonJS 和 AMD 规范,也可以将模块导出至全局变量。在浏览器中使用 UMD 规范时,不需要额外的编译工具。

esm 打包

// 导出函数
export function functionA() {
  // ...
}
export function functionB() {
  // ...
}

// 引入函数
import { functionA } from './moduleA.js';
functionA();

在 esm 规范下,导出函数使用 export,导入函数使用 import。ESM 支持异步加载和动态导入,可以用于前端模块化和构建工具的高效处理。在浏览器中使用 ESM 规范时,需要使用类似于 Webpack 或者 Rollup 的工具将其编译为可以在现代浏览器中使用的代码。

示例说明

这里给出两个示例,分别说明使用 cjs 和 esm 规范的打包方式。

cjs 示例

假设有一个模块 math.js,包含 addsubtract 两个函数,如下所示:

// math.js
module.exports = {
  add: function(a, b) {
    return a + b;
  },

  subtract: function(a, b) {
    return a - b;
  },
};

现在在另一个脚本文件 index.js 中,需要使用 math.js 中的函数,可以按照以下方式导入:

const math = require('./math');

console.log(math.add(1, 2)); // 输出 3
console.log(math.subtract(3, 1)); // 输出 2

在浏览器中使用 cjs 规范时,需要使用类似于 Browserify 的工具将其编译为可以在浏览器中使用的代码。下面是使用 Browserify 打包的命令:

browserify index.js -o bundle.js

打包完成后会生成 bundle.js 文件,可以在 HTML 文件中引用该文件,如下所示:

<script src="./bundle.js"></script>

esm 示例

假设有一个模块 math.js,包含 addsubtract 两个函数,如下所示:

// math.js
export function add(a, b) {
  return a + b;
}

export function subtract(a, b) {
  return a - b;
}

现在在另一个脚本文件 index.js 中,需要使用 math.js 中的函数,可以按照以下方式导入:

import { add, subtract } from './math.js';

console.log(add(1, 2)); // 输出 3
console.log(subtract(3, 1)); // 输出 2

在浏览器中使用 ESM 规范时,需要使用类似于 Webpack 或者 Rollup 的工具将其编译为可以在现代浏览器中使用的代码。下面是使用 Webpack 打包的命令:

webpack index.js -o bundle.js

打包完成后会生成 bundle.js 文件,可以在 HTML 文件中引用该文件,如下所示:

<script type="module" src="./bundle.js"></script>

在上述示例中,cjs 和 esm 打包方式的代码差异比较大,但是在实际项目中,可以根据具体需求选择合适的打包方式,实现高效的前端工程化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前端工程化cjs umd esm 打包差异详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxListBox incrementalSearch属性

    jQWidgets jqxListBox incrementalSearch属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxListBox是其中之一。本文将详细介绍jqxListBox的incrementalSearch属性,包括定义、语法和示例。 incrementalSearch属性的定义 jqxListB…

    jquery 2023年5月10日
    00
  • Jquery实现获取子元素的方法分析

    当使用jQuery开发网页时,经常需要对网页中的子元素进行操作。如果不知道如何找到子元素,那么对子元素的操作就会受到限制。本篇攻略将带您了解jQuery实现获取子元素的方法,方便您在开发中找到想要的子元素。 子元素的基本概念 在HTML中,子元素指的是包含在父元素内部的元素。例如,在以下HTML代码中, 元素是 元素的子元素: <ul> <…

    jquery 2023年5月28日
    00
  • 如何在jQuery中的hover事件中运行代码

    使用jQuery可以轻松地在hover事件中运行代码。以下是详细的攻略,包含两个示例,演示如何在jQuery的hover事件中运行代码: 步骤1:引入jQuery库 在使用之前,需要先在HTML文引jQuery库。可以通过以下方式引入: <script src="https://code.jquery.com/jquery-3.6.0.min…

    jquery 2023年5月9日
    00
  • jQWidgets jqxTree disabled 属性

    disabled 属性用于禁用 jQWidgets jqxTree 组件。当该属性设置为 true 时,用户无法与组件进行交互。以下是 jQWidgets jqxTree disabled 属性的完整攻略: jQWidgets jqxTree disabled 属性 disabled 属性用于禁用 jQWidgets jqxTree 组件。 语法 $(‘#t…

    jquery 2023年5月11日
    00
  • jQuery Mobile Column-Toggle Table classes.priorityPrefix选项

    “jQuery Mobile Column-Toggle Table classes.priorityPrefix选项” 是 jQuery Mobile 表格组件中的一项功能,它可以用于隐藏表格的列并控制列的显示。接下来将详细讲解该功能的使用方法及示例说明。 什么是 jQuery Mobile Column-Toggle Table jQuery Mobil…

    jquery 2023年5月12日
    00
  • jQuery UI Slider option()方法

    jQuery UI Slider option()方法攻略 jQuery UI Slider是一个强大的JavaScript库,它提供了许多选项和功能,以便创建自定义的滑块。其中,option()方法用于设置或获取滑块的选项。以下是详细攻略,含两个示例,演示如何使用option()方法: 步骤1:引入库 在使用之前,需要先在中引入jQuery库和jQuery…

    jquery 2023年5月9日
    00
  • JQuery查找子元素find()和遍历集合each的方法总结

    JQuery查找子元素find()和遍历集合each的方法总结 在开发前端网页时,使用jQuery可以方便地处理DOM元素。其中,查找子元素和遍历集合是经常用到的操作。本文主要讲解jQuery中的find()方法和each()方法的使用。 一、JQuery find()方法 1.1 find()方法概览 jQuery中的find()方法可以根据选择器查找匹配…

    jquery 2023年5月28日
    00
  • jQuery实现条件搜索查询、实时取值及升降序排序的方法分析

    jQuery实现条件搜索查询、实时取值及升降序排序的方法分析 在使用 jQuery 实现条件搜索查询、实时取值及升降序排序时,可以使用以下方法: 1. 条件搜索查询 条件搜索查询即根据用户在搜索框输入的关键词等条件,从数据源中筛选出符合条件的数据。其中,jQuery 可以使用 $.grep() 方法进行筛选。 示例: 首先,定义一个数据源: var prod…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部