前端工程化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日

相关文章

  • 利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值

    实现弹出可拖动的Div的方法有很多种,其中使用JQuery+EasyDrag是比较简单实用的一种。下面给出具体的实现方法。 1. 引入相关资源 在HTML文件中引入JQuery和EasyDrag库。 <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.j…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGrid scrolloffset()方法

    jQWidgets jqxGrid scrolloffset()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxGrid是其中之一,本文将详细介绍jqxGrid的scrolloffset()方法,包括定义、语法和示例。 scrolloffset()方法的定义 jqxGrid的scrolloffset()方法用于…

    jquery 2023年5月10日
    00
  • jQWidgets jqxExpander expanded属性

    jQWidgets jqxExpander expanded属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包括表格下等。jqxExpander是jQWidgets的一个组件,用于创建可折叠的面板。jqxExpander提供了多个属性,其中括expanded属性。本文将详细介绍jqxExpander的expanded属性,…

    jquery 2023年5月9日
    00
  • jQWidgets jqxDateTimeInput宽度属性

    以下是关于“jQWidgets jqxDateTimeInput宽度属性”的完整攻略,包含两个示例说明: 属性简介 width 属性是 jWidgets jqxDateTimeInput 控件的一个属性,用于设置日期时间输入框的宽度。该属性的语法如下: // 设置日期输入框的宽度 $("#jqxDateTimeInput").jqxDat…

    jquery 2023年5月10日
    00
  • jQuery die()方法

    jQuery die()方法已经在jQuery 1.9版本中被废弃,不再推荐使用。取而代之的是.off()方法。.off()方法于从选定元素中移除一个或多个事件处理程序。以下是.off()方法的基本语法: $(selector).off(event childSelector, handler); 在这个语法中,selector是要操作的元素的选择器,eve…

    jquery 2023年5月9日
    00
  • jquery submit ie6下失效的原因分析及解决方法

    《jquery submit ie6下失效的原因分析及解决方法》攻略 问题描述 在ie6下,使用jQuery中的submit()方法提交表单时,会出现失效的情况。这是因为ie6中的submit()方法是基于form元素的submit方法实现的,而jQuery中将form.submit()方法重写后,导致ie6中submit()方法失效的问题。下面我们将解决这…

    jquery 2023年5月28日
    00
  • EasyUI的jQuery日期栏小工具

    那么接下来,我将详细讲解如何使用EasyUI的jQuery日期栏小工具。 概述 日期栏小工具是 EasyUI 中一个非常实用的小部件,可以快速帮助前端工程师构建时间选择器,进而辅助用户快速选择日期。 具体步骤 步骤一:引入EasyUI相关的样式文件和JS文件 日期栏小工具依赖jquery、jquery.easyui.min.js、easyui.css样式文件…

    jquery 2023年5月13日
    00
  • 当jQuery遭遇CoffeeScript的时候 使用分享

    当jQuery遭遇CoffeeScript,许多开发者往往会觉得这组合在一起会变得非常强大。CoffeeScript 是一种能够让你以清晰、简洁的语法编写 JavaScript 代码的编程语言,而 jQuery 是一个广泛使用的 JavaScript 库,它可以帮助我们更快地完成 DOM 操作,处理事件等。下面,我将详细介绍如何使用 jQuery 和 Cof…

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