1. JS中的模块规范(CommonJS,AMD,CMD)以及es6语法
1.1 CommonJS
如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已。
现在就看看吧,这些规范到底是啥东西,干嘛的。 CommonJS就是为JS的表现来制定规范,因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。 CommonJS能有一定的影响力,我觉得绝对离不开Node的人气,不过喔,Node,CommonJS,浏览器甚至是W3C之间有什么关系呢,我找到了个贴切的图:CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。 所以可理解为node遵循CommonJS的规范,但是相比也是做了一些取舍,填了一些新东西的。
举个栗子://a.jsmodule.exports=function add() { return 1+2};/*module.exports={ dev:1+4}*///b.js var a=require('./a');// var a=import('./a');console.log('bb',a)结果:$ node bbb function add() { return 1+2}复制代码
1.2 AMD(Asynchronous Module Definition)
CommonJS是主要为了JS在后端的表现制定的,他是不适合前端的,为什么这么说呢?
这需要分析一下浏览器端的js和服务器端js都主要做了哪些事,有什么不同了:*服务器端JS | *浏览器端JS |
---|---|
相同的代码需要多次执行 | 代码需要从一个服务器端分发到多个客户端执行 |
CPU和内存资源是瓶颈 | 带宽是瓶颈 |
加载时从磁盘中加载 | 加载时需要通过网络加载 |
于是乎,AMD(异步模块定义)出现了,它就主要为前端JS的表现制定规范。
AMD就只有一个接口:define(id?,dependencies?,factory);
它要在声明模块的时候制定所有的依赖(dep),并且还要当做形参传到factory中,像这样:
define(['dep1','dep2'],function(dep1,dep2){...});复制代码
要是没什么依赖,就定义简单的模块,下面这样就可以啦:
define(function(){ var exports = {}; exports.method = function(){...}; return exports;});复制代码
咦,这里有define,把东西包装起来啦,那Node实现中怎么没看到有define关键字呢,它也要把东西包装起来呀,其实吧,只是Node隐式包装了而已.....
RequireJS就是实现了AMD规范的呢。
这有AMD的WIKI中文版,讲了很多蛮详细的东西,用到的时候可以查看:
1.3 CMD(Common Module Definition)
大名远扬的玉伯写了seajs,就是遵循他提出的CMD规范,与AMD蛮相近的,不过用起来感觉更加方便些,最重要的是中文版,应有尽有:
define(function(require,exports,module){...});复制代码
用过seajs吧,这个不陌生吧,对吧。
前面说AMD,说RequireJS实现了AMD,CMD看起来与AMD好像呀,那RequireJS与SeaJS像不像呢?
虽然CMD与AMD蛮像的,但区别还是挺明显的,官方非官方都有阐述和理解,我觉得吧,说的都挺好:
小结:
写法对比
//CMDdefine(function(require,exports,module){ var a=require('./a') a.doSomethimg() var b=require('./b') b.doSomething() })//AMDdefine(['./a','./b'],function(a,b){ a.doSomething() b.dosomething() })//es6(游览器)require/improt export//commonJSrequire(支持es6需要require("babel-register"))module.exports=...复制代码
规 范 | 加载方式 | 导入 | 导出或定义 | 特 点 |
---|---|---|---|---|
CommonJS | 运行时加载 | require() | module.exports | 社区方案,提供了服务器/浏览器的模块加载方案。非语言层面的标准。只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化。 |
AMD | 运行时加载 | require() | define() | 异步加载,有依赖项,只有所有依赖完成才执行回调函数,提前加载用户体验好,requireJS配合define成为AMD规范。 |
CMD | 运行时加载 | require() | define() | 异步加载,没有依赖项就近加载,性能好,seaJS配合define成为CMD规范。 |
ESMAScript6+(es6+) | 编译时加载 | import | export | ES6自带了模块化, 也是JS第一次支持module, 可以直接作用import和export在浏览器中导入和导出各个模块;一个js文件代表一个js模块;语言规格层面支持模块功能。支持编译时静态分析,便于JS引入宏和类型检验。动态绑定 |
参考文档:
- 和、
- 、 、
2.编码函数与unicode
2.1 escape,encodeURI,encodeURIComponent
var str1="我爱html,css,javascript;~!@#$%^&*";escape(str1).replace(/%u/g,'\\u');// \u6211\u7231html\uFF0Ccss\uFF0Cjavascript%3B%7E%21@%23%24%25%5E%26*unescape(str1);var str2="不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。 ——文森特・梵高;~!@#$%^&*";encodeURI(str2).replace(/%u/g,'\\u');// "%E4%B8%8D%E8%A6%81%E5%90%B9%E7%81%AD%E4%BD%A0%E7%9A%84%E7%81%B5%E6%84%9F%E5%92%8C%E4%BD%A0%E7%9A%84%E6%83%B3%E8%B1%A1%E5%8A%9B;%20%E4%B8%8D%E8%A6%81%E6%88%90%E4%B8%BA%E4%BD%A0%E7%9A%84%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%A5%B4%E9%9A%B6%E3%80%82%20%E2%80%94%E2%80%94%E6%96%87%E6%A3%AE%E7%89%B9%E3%83%BB%E6%A2%B5%E9%AB%98;~!@#$%25%5E&*"decodeURI(encodeURI(str2).replace(/%u/g,'\\u'));encodeURIComponent(str3).replace(/%u/g,'\\u');// %E6%88%91%E7%88%B1html%EF%BC%8Ccss%EF%BC%8Cjavascript%3B~!%40%23%24%25%5E%26*decodeURIComponent(encodeURIComponent(str1).replace(/%u/g,'\\u'));复制代码
附图:
小结
编码类型 | 特点 |
---|---|
escape(unescape) | 所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / + |
encodeURI(decodeURI) | 不会被此方法编码的字符: ! @ # $& * ( ) = : / ; ? + ' |
encodeURIComponent(decodeURIComponent) | 把URI字符串采用UTF-8编码格式转化成escape格式的字符串,把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) |
参考文档:
alter user 'root'@'localhost' identified with mysql_native_password by '你的密码';alter user 'root'@'localhost' identified with mysql_native_password by '123456';复制代码