设为首页 收藏本站
查看: 1030|回复: 0

[经验分享] JavaScript代码模块化的正规方法

[复制链接]

尚未签到

发表于 2017-2-25 08:55:19 | 显示全部楼层 |阅读模式
  RequireJS-CommonJS-AMD-ES6 Import/Export详解
  为什么起了一个这个抽象的名字呢,一下子提了四个名词分别是:RequireJS,CommonJS,AMD,ES6,答案是因为现实很骨感,我们必须很勇敢才能正视这一段悲催的往事。如今的JavaScript平台正值如日中天,大家可能会忽略他的过去和弊端,这些弊端中一直被人诟病的就是JavaScript的包管理,比如类似Java中的import,其实理论上来讲这种基本元素的缺失大大的阻碍了人们对一种语言的认可,认为他难以担当大任,其实这么多年来JavaScript平台的发展主要还是他存在的位置比较有利,在浏览器中,有标准的支持和约束,跨平台等等,但是这种先天不足就没办法了,只能后天努力,这样从ES3-ES6不断地加入新的功能终于使JavaScript这门语言逐渐完备,这个漫长的过程让我们逐渐的明白了一个道理:社会的需求胜过十驾马车的力量可以催生一项技术不断的完善,进步。
  正如前面提到的JavaScript没有包管理,不适合构建复杂应用,但是现实是就需要用JavaScript来构建复杂应用,因为随着社会的进步,人们对web应用的期许提高了,这都难不倒工程师,不是语言不提供么,我们有work around。先来说说CommonJS,
  CommonJS的出发点是让JavaScript这门语言写出的代码可以跨前后端,(当然这里面指的是逻辑代码,不包含DOM, BOM操作)也就是可以在不同的宿主上跑,不如同一段代码可以跑在NodeJS也可以跑在Nashorn或者浏览器,但是事实上对CommonJS标准应用最多的是NodeJS平台,也就是NodeJS中的Require, 那么CommonJS Require为什么没有在浏览器里流行呢,主要原因是这个Require是同步的,这个浏览器接受不了,用户体验差,下面我们来说说浏览器中的AMD。



// sum.js
module.exports = {
sum: function(a, b) { return a + b; }
};
// app.js
var assert = require('assert');
var cal = require('./sum');
assert.equal(3, cal.sum(1, 2));
  CommonJS在浏览器中不行我们再找一个方式,总会有适合的,下面我们来说说AMD (Asynchronous Module Definition) 对CommonJS稍加改变,构造一个异步的变种就得到了AMD,示例代码如下,这下变成异步的了,终于可以在浏览器中使用了



// sum.js
define("sum", function() {
return {
sum: function(a, b) { return a + b; }
};
});
// app.js
define("app", ["sum"], function(cal) {
console.log(cal.sum(1, 2)); // => 3
});
  但是以上的代码直接写是没办法运行的,如果想在浏览器中直接运行,需要知道define是个什么鬼,所以需要先把RequireJS引入,这就是RequireJS的作用,在浏览器中实现define, 引入依赖包。



<script data-main="scripts/main" src="scripts/require.js"></script>
// main.js
requirejs.config({ baseUrl: '/scripts' });
requirejs(['app']);
  看着这种不一致的痛苦ECMAScript 6终于忍不了了,加入了import/export标准来统一JavaScript世界,这就是标准的力量,但是从语法上来看还是同步的加载,还是没有办法支持浏览器,不知道这块ECMAScript 6是怎么考量的。



// sum.js
export function sum(a, b) { return a + b; }
// app.js
import * as cal from 'sum';
console.log(cal.sum(1, 2)); // => 3
  综合以上的分析,在ES6还没有实现完成的今天如果想写一段同时支持前后台,支持AMD, CommonJS的代码要想下面这个样子。



;(function (root, factory, undef) {
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory(require("./core"), require("./cipher-core"));
}
else if (typeof define === "function" && define.amd) {
// AMD
define(["./core", "./cipher-core"], factory);
}
else {
// Global (browser)
        factory(root.CryptoJS);
}
}(this, function (CryptoJS) {
return CryptoJS.pad.Pkcs7;
}));
  总结
  本文总结了RequireJS,CommonJS,AMD,ES6 import/export的前世今生,并且对每个部分给出了完整的代码样例,希望对大家有所帮助。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346837-1-1.html 上篇帖子: Node.js数据流Stream之Readable流和Writable流 下篇帖子: 用Node.js开发微信公众号
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表