

兼容AMD CMD CommonJS 原生浏览器的封装写法
source link: https://www.geekjc.com/post/5dbf97e07aee1547681481b3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

获取最新福利

兼容AMD CMD CommonJS 原生浏览器的封装写法
经常看见一些库,可以支持浏览器和Node引用,同时兼容多种模块化规范(AMD CMD CommonJS)。比如著名的Vue,你可以使用下面的方法:
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
const Vue = require('vue');
既可以直接引入js使用,也可以和webpack等模块化打包工具结合使用,非常方便!
那么这是怎么实现的呢?
其实原理很简单,通过检测引入文件时的环境,如果是支持CommonJS或者CMD,则导出时使用
module.exports
如果支持AMD,则导出时使用
define()
否则,默认是浏览器环境,直接在window对象上添加
1. 简单实例
(function (global, factory) {
// 导出模块
})(this, (function () {
// 真正的逻辑代码
}))
首先,上面这段代码,可以算是一个模板代码,你可以在各种JS库的源码里看到类似的影子。
这段代码定义了一个立即执行函数:把当前的全局对象(this)和一个匿名函数当作参数传给了另外一个马上就要执行的匿名函数
改写成这样可以容易理解点:
(function B (global, factory) {
// 导出模块
})(this, (function A () {
// 真正的逻辑代码
}))
全局对象this和函数A当作参数传给了函数B,函数B通过global接收this,factory接收A,然后函数B立即执行
hentai.js
(function (global, factory) {
if (typeof exports === 'object' && typeof module !== 'undefined') {
// CommonJS、CMD规范检查
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
// AMD规范检查
define(factory);
} else {
// 浏览器注册全局对象
global.Geekjc = factory();
}
})(this, (function () {
function say() {
console.log('hello geekjc');
}
return {
say: say
}
}))
现在你可以在浏览器或者node中使用了
<script src="./geekjc.js"></script>
<script>
Geekjc.say(); // hello geekjc
</script>
const Geekjc = require('geekjc');
Geekjc.say(); // hello geekjc
Recommend
-
71
模块化的开发方式可以提高代码复用率,方便进行代码的管理。通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数。目前流行的js模块化规范有CommonJS、AMD、CMD以及ES6的模块系统。参见阮一峰老师的文章 module-loader 。
-
59
-
22
你真的懂模块化吗 加紧学习,抓住中心,宁精勿杂,宁专勿多。 —— 周恩来 模块简史 早期的 JavaScript 往往作为嵌入到 HTML 页面中的用于控制动画与简单的用户交互的脚本语言,我们习惯这样写。 <!--html--> <s
-
42
叨叨一会CommonJS Common这个英文单词的意思,相信大家都认识,我记得有一个词组common knowledge是常识的意思,那么CommonJS是不是也是类似于常识性的,大家都理解的意思呢?很明显不是,这个常识一点都不常识。我最初认为commonJ
-
27
本文由云+社区发表 模块化是指把一个复杂的系统分解到一个一个的模块。 模块化开发的优点: (1)代码复用,让我们更方便地进行代码管理、同时也便于后面代码的修改和维护。 (2)一个单独的文件就是一...
-
29
pahen/madge: Create graphs from your CommonJS, AMD or ES6 module dependencies ...
-
36
-
29
前言:模块化开发需求 在JS早期,使用script标签引入JS,会造成以下问题: 加载的时候阻塞网页渲染,引入JS越多,阻塞时间越长。 容易污染全局变量。 js文件存在依赖关系,加载必须有顺...
-
30
兼容原生SpringBoot配置规范, BRCC助你一站式解决项目配置建设需求 1. Springboot config示例与原理介绍1.1 Springboot config示例Spring...
-
6
AMD或会为霄龙Milan处理器上X3D封装,最多64核
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK