博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web归纳
阅读量:5897 次
发布时间:2019-06-19

本文共 3970 字,大约阅读时间需要 13 分钟。

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引入宏和类型检验。动态绑定

参考文档:

  1. 和、
  2. 、 、

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将显示错误。不会被此方法编码的字符:! * ( )

参考文档:

欢迎讨论文章不足之处
[mysql8.x安装后重置密码](https://www.jb51.net/article/150590.htm)
alter user 'root'@'localhost' identified with mysql_native_password by '你的密码';alter user 'root'@'localhost' identified with mysql_native_password by '123456';复制代码

转载地址:http://onosx.baihongyu.com/

你可能感兴趣的文章
史上最全web.xml配置文件元素详解
查看>>
Atitit WebDriver技术规范原理与概念
查看>>
java对email邮箱的真实、有效性验证
查看>>
吃瓜群众的三言两语,想听的就进来看看吧!
查看>>
检测pycaffe安装好没
查看>>
假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?...
查看>>
Linux下用netstat查看网络状态、端口状态
查看>>
Linux 文件与目录管理
查看>>
JSON.parse()和JSON.stringify()
查看>>
打开居中显示的窗口
查看>>
.Net 5分钟搞定网页实时监控
查看>>
[转]RabbitMQ系列(一):Windows下RabbitMQ安装及入门
查看>>
OEL的下载
查看>>
U盘强制拔出数据丢失怎么办
查看>>
php 7.2 安装 mcrypt 扩展
查看>>
Linux上安装使用boost入门指导
查看>>
16种oracle查询日期语句
查看>>
myeclipse添加spket插件
查看>>
Silverlight WCF RIA服务(二十二)Silverlight 客户端 3
查看>>
Linux内核的文件预读详细详解
查看>>