前端模块化 CommonJS AMD ES6 CMD

不使用模模块化的情况

  • util.js(基础函数库) getFormatDate 函数
  • a-util.js(业务基础函数库) aGetFormatDate 函数 使用getFormatDate
  • a.js aGetFormatDate

  • // util.js
    function getFormatDate(date, type) {
        // type === 1 返回 xxxx
        // type === 2 返回 xxx
        // ...
    }
    
    // a-util.js
    function aGetFormatDate(date) {
        //要求返回 xxx 格式
        return getFormatDate(date, 2)
    }
    
    // a.js
    var dt = new Date()
    console.log(aGetFormatDate(dt))
    
    <script src="util.js"></script>
    <script src="a-util.js"></script>
    <script src="a.js"></script>

    这些代码中的函数必须是全局变量,才能暴露给使用方,全局变量污染

  • a.js知道要引用a-util.js,但是他还知道要依赖util.js么?

使用模块化

// util.js
export {
    function getFormatDate(date, type) {
    // type === 1 返回 xxxx
    // type === 2 返回 xxx
    // ...
    }
}

// a-util.js
var getFormateDate require(‘util.js‘)
export {
    function aGetFormatDate(date) {
    //要求返回 xxx 格式
    return getFormatDate(date, 2)
    }
}

// a.js
var aGetFormatDate = require(‘a-util.js‘)
var dt = new Date()
console.log(aGetFormatDate(dt))
  • 直接<script src="a.js"></script>,其他根据依赖关系自动引用
  • 那两个函数,没必要做成全局变量,不会带来污染和覆盖

AMD(异步模块定义)

  • require.js requirejs.org
  • 全局define函数
  • 全局require函数
  • 依赖JS会自动、异步加载

//util.js
define(function () {
    return {
        getFormatDate(date, type) {
    // type === 1 返回 xxxx
    // type === 2 返回 xxx
    // ...
    }
    }
})

// a-util.js
define([‘./util.js‘], function (util) {
    return {
        aGetFormatDate: function(date) {
            return util.getFormatDate(date,2)
        }
    }
})

// a.js
define([‘a-util.js‘], function (aUtil) {
    return {
        printDate: function(date) {
            console.log(aUtil.aGetFormatDate(date))
        }
    }
})

// main.js
required([‘./a.js‘], function(){
    var date = new Date()
    a.printDate(date)
})
使用require.js
<scritp src="/require.min.js" data-main="./main.js"></scritp>

require()函数在加载依赖函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块加载成功,才会去执行。
因为网页在加载js的时候会停止渲染,因此我们可以通过异步的方式去加载js,而如果需要依赖某些,也是异步去依赖,依赖后再执行某些方法。

CommonJS

  • nodejs 模块化规范,现在被大量用于前端
  • 其那段开发依赖的插件和库,都可以从npm中获取
  • 构建工具的高度自动化,使得使用npm的成本非常低
  • CommonJS不会异步加载JS,而时同步一次性加载出来
// util.js
module.exports = {
    getFormatDate(date, type) {
    // type === 1 返回 xxxx
    // type === 2 返回 xxx
    // ...
    }
}

// a-util.js
var util = require(‘util.js‘)
module.exports = {
    aGetFormatDate: function(date) {
            return util.getFormatDate(date,2)
        }
}

AMD 和 CommonJS 的使用场景

  • 需要异步加载JS,使用AMD
  • 使用了npm之后建议使用CommonJS

    ES6实现模块化

    如果使用es6语法,那么则无需引入requireJS进行模块化,它的特点主要为:

    • 在模块顶级作用域中的this为undefine。
    • 单个文件为一个模块,顶级作用域声明的变量只在当前模块生效。对其他模块不影响, 对外导出的变量才能被其他变量使用

    定义

    导出内容有俩种关键字:

    • export 导出该模块要导出的变量、函数、对象等等。
    export const color = ‘#fff‘;
    • as 输出时创建别名,也适用于导入情况。
    const color = ‘#fff‘;
    export color as white
    • export default 该模块的默认输出值,可以为变量、函数、对象,一个模块只能导出一个默认值。默认导出的内容可以无名称,因为默认导出就代表该模块,但也可以有名称,或者使用别名 as。
    export default const color = ‘#fff‘;
    // export default 5;
    // const color = ‘#fff’;
    // export { color as default  }

    使用

    • 在模块中使用import关键字来导入其他模块导出的内容。 分为几种情况:
    • 导入非默认内容,需要用结构的方式,因为在模块中,非默认导出的内容,都会被添加到一个变量中,用结构的方式拿出一个或多个内容。
    import { color } from ‘./color‘;
    • 导入默认内容,可以直接导出即可。
    import color from ‘./color‘;

    CMD

    CMD规范的实现代表是sea.js

    • 对于依赖的模块AMD是提前执行,CMD是延迟执行。不过RequireJS从2.0开始,也改成可以延迟执行(根据写法不同,处理方式不通过)。
    • CMD推崇依赖就近,AMD推崇依赖前置。
    //AMD
    define([‘./a‘,‘./b‘], function (a, b) {
    
        //依赖一开始就写好
        a.test();
        b.test();
    });
    
    //CMD
    define(function (requie, exports, module) {
    
        //依赖可以就近书写
        var a = require(‘./a‘);
        a.test();
    
        ...
        //软依赖
        if (status) {
    
            var b = requie(‘./b‘);
            b.test();
        }
    });

    简单来说,就是sea.js属于懒加载,require.js属于预加载.

     

原文地址:https://www.cnblogs.com/xiaoyuchen/p/10544835.html

时间: 2024-10-12 21:42:48

前端模块化 CommonJS AMD ES6 CMD的相关文章

前端模块化(CommonJs,AMD和CMD)

前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境AMD 是 RequireJS 在推广过程中对模块定义的规范化产出.CMD 是 SeaJS 在推广过程中对模块定义的规范化产出.AMD:提前执行(异步加载:依赖先执行)+延迟执行CMD:延迟执行(运行到需加载,根据顺序执行) 模块 函数写法 function f1(){ //... } function f2(){ //... } 模块就是实现特定功能的文件,把几个函数放在一个文件里

JavaScript模块化 --- Commonjs、AMD、CMD、es6 modules

随着前端js代码复杂度的提高,JavaScript模块化这个概念便被提出来,前端社区也不断地实现前端模块化,直到es6对其进行了规范,下面就介绍JavaScript模块化. 这篇文章还是希望能给大家一个比较好的思路,即JavaScript模块化是如何一步一步地发展起来的,并且也会主要对这些模块化方式做一个简单的比较. 第一阶段:无模块化 JavaScript最初的作用仅仅是验证表单,后来会添加一些动画,但是这些js代码很多在一个文件中就可以完成了,所以,我们只需要在html文件中添加一个scri

对于模块加载:ES6、CommonJS、AMD、CMD的区别

运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程. 链接,是把编译生成的二进制文件,组合成为一个系统可以执行的可执行文件. 运行: 把编译出来的可执行文件代码在系统中执行的过程,此时被装载到内存中. (代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的). 运行时类型检查就

前端模块化杂记

更好的阅度体验 前言 CMD\AMD简介 Commonjs简介 Module简介 Common和Module的区别 Module与webpack Module与Babel 一些问题 总结 引用 前言 前端模块化在近几年层出不穷,有Node的CommonJs,也有属于client端的CMD/AMD模式,而ES6本身也出现了Modules,再加上Webpack以及babel的普及,虽然在代码中经常使用到这些用法,但是如果不去深入研究,总觉得是一个黑魔法,无法探测一些问题的根源. AMD/CMD简介

前端模块化方案:CommonJS/AMD/CMD/ES6规范

模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块系统.前端模块化的演进过程可以看看阮一峰老师的文章.本文主要介绍各规范下的模块化实现方式. 一.CommonJS Node.js是commonJS规范的主要实践者,它有四个重要的环境变量为模块化的实现提供支持:module.exports.require.global.实际使用时,用module.e

前端模块化:CommonJS,AMD,CMD,ES6

模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块系统.参见阮一峰老师的文章 module-loader . 一.CommonJS Node.js是commonJS规范的主要实践者,它有四个重要的环境变量为模块化的实现提供支持:module.exports.require.global.实际使用时,用module.exports定义当前模块对外输出

再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6

Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果. CommonJS CommonJS定义的模块分为:  模块引用(require)    模块输出(exports)       模块标识(module) CommonJS Modules有1.0.1.1.1.1.1三个版本: Node.js.SproutCore实现了 Mo

amd、cmd、CommonJS以及ES6模块化

AMD.CMD.CommonJs.ES6的对比 他们都是用于在模块化定义中使用的,AMD.CMD.CommonJs是ES5中提供的模块化编程的方案,import/export是ES6中定义新增的 什么是AMD.CMD.CommonJs? 他们之间有什么区别? 项目当中是如何使用? 1)AMD-异步模块定义 AMD是RequireJS在推广过程中对模块定义的规范化产出,它是一个概念,RequireJS是对这个概念的实现,就好比JavaScript语言是对ECMAScript规范的实现.AMD是一个

JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6

前言:模块化开发需求 在JS早期,使用script标签引入JS,会造成以下问题: 加载的时候阻塞网页渲染,引入JS越多,阻塞时间越长. 容易污染全局变量. js文件存在依赖关系,加载必须有顺序.项目较大时,依赖会错综复杂. 引入的JS文件过多,不美观,且不易于管理. 一.CommonJS规范 CommonJS Modules/1.0规范,服务器端规范. Node.js推广使用.该规范的核心是:允许模块使用require方法来同步加载所依赖的其他模块,然后通过exports或module.expo