一、BS or CS ?
C/S : 即Client/Server,客户机/服务器模式。
两层: 客户机和服务器两层,第一层,在客户机系统上结合了界面显示与业务逻辑;第二 层,通过网络结合了数据库服务器。
特 点: 如果用户要使用的话,需要下载客户端,安装后就可以使用
优缺点: 界面和操作可以很丰富;两层传输,安全性高;只有一层交互,响应速度快。一般在局域网中,适用面窄;需安装,用户群固定;升级成本高,发生一次升级,所有程序都需要更新。
B/S : 全称为Browser/Server,即浏览器/服务器结构。
三层: 表现层主要完成用户和后台的交互及最终查询结果的输出功能;逻辑层主要是利用服务器完成客户端的应用逻辑功能; 数据层主要是接受客户端请求后独立进行各种运算。
优缺点: 无需安装客户端,有浏览器即可; 架构在广域网上,交互性强;更新迭代方便,只需更新服务器即可。跨浏览器适配问题;中间层较多,速度和安全性问题;请求响应的交互模式,需要刷新页面,不友好。
架构形式: 客户端-服务器-数据库;
客户端-web服务器-应用服务器-数据库
客户端-负载均衡器(Nginx)-中间服务器(Node)-应用服务器-数据库
二、 JavaScript发展历程
工具类库-〉组件库-〉前端框架-〉前端应用(不断抽象类化的过程)
暴露的问题:缺乏模块。通过script方式引入代码杂乱无章。
Javascript规范:CommomJs
三、CommonJs规范
J avascript 缺陷 :没有模块系统;标准库较少;没有统一标准接口;缺乏包管理系统。
CommonJs 目的 :希望javascript能够在任何地方运行。使javascript能编写服务端应用程序,命令行工具,桌面应用程序,混合应用。
Node借鉴了commonJs的modules规范。
规范: 引用:require();定义:exports;模块标识:小驼峰命名的字符患/路径;
导出 :在node中,一个文件就是一个模块,模块中存在module对象,它代表模块本身,exports是module的属性。
四、Node模块实现
node 加载模块三步骤 :路径分析 文件定位 编译执行
node 模块分类 :核心模块 文件模块
核心模块 :node提供,在node源码编译中编译进了二进制执行文件,在node启动时,部分加载到内存中,不需要文件定位和编译执行,并且在路径分析中优先判断,加载速度最快
文件模块 :运行时动态加载,需完成三步骤,速度比核心模块慢
模块缓存加载策略: node对引入过的模块进行缓存,缓存的是编译和执行之后的对象。
路径分析与模块定位: modules.paths,与js作用域链查找方式相似,逐级查找直到查找到文件。文件标示符不包含扩展名,按照.js 、.json、.node的顺序依次补足扩展名尝试。
模块编译: 按照不同扩展名采用不同载入方式
.js 通过fs模块同步读取后编译执行。
.node,c++编写的扩展文件,通过dlopen()加载后编译生成文件
.json,通过fs模块同步读取后,用json.parse()返回结果
其余文件按js文件载入
五、核心模块
编译成可执行文件过程中被编译进了二进制文件。分为 javascript编写和c++编写 两部分。C++编写的放在node项目src文件夹下,javascript编写的放在lib目录下。
Javascript核心模块的编译: 转存为c/c++代码(v8附带的js2c.py工具),通过process.binding(‘natives’)取出,编译成功模块缓存在NativeModule._cache对象上,文件模块缓存在 Module._cache上。
c/c++核心模块的编译: 有的全部由c++编写,有的c++完成核心部分,其他部分由javascript实现包装向外导出。这种c++完成核心,javascript完成峰和钻过的模式是node提高性能的常见方式。通常 脚本语言 的开发速度优于 静态语言 ,但是其性能弱于静态语言。Node的复合模式在开发速度和性能之间找到了平衡点。
核心模块分类: 由存c++编写的部分称为内建模块。如buffer、fs、os。内建模块的优势在于:首先它由c++编写,性能上优于脚本语言,其次,在进行文本编译时,编译为二进制文件,一旦node执行,被直接加载到内存中,无需标识定位、文件定位、编译过程即可执行。
六、C++扩展模块
通过预先编译为.node文件,然后调用process.dlopen()方法执行。
七、包与npm
node第三方模块通过包与npm将模块联系起来。
包结构: package.json:包描述文件。 bin:存放包可执行二进制文件的目录。lib:存放javascript代码的目录。doc:存放文档的目录。test:存放单元测试用例的代码。
## 代码分类 :源代码/目标代码
源代码: 采用某种编程语言编写的计算机程序,人类可读,如result=1+2
目标代码: 计算机可直接执行,人类不可读(专家除外),如11010010
将源代码转换为目标代码的方式:解释/编译
编译: 将源代码一次性转换成目标代码的过程。编译是一次性翻译,之后不再需要源代码(类似英文翻译)常用的.exe文件,就是经过编译后的源代码。源代码编译生成机器语言,再由机器运行机器码(二进制)。
解释: 将源代码逐条转换成目标代码,同时逐条运行的过程,解释是每次程序运行是随翻译执行(类似英文的同声传译)。程序时要由解释器程序实时地将源代码转换成二进制形式运行。
##语言分类
* 根据解释和编译两种执行方式 ,编程语言分为 解释型语言 和 编译型语言 ;
编译型语言的优点 :运行速度快,代码效率高,编译后程序不可以修改,保密性好。
编译型语言的缺点 :
- 代码需要经过编译方可运行,可移植性差,只能在兼容的操作系统上运行。
- 安全性不如解释性语言,一个编译型的程序可以访问内存的任何区域,并且可以对你的PC做它想做的任何事情(大部分病毒是使用编译型语言编写的)。
解释型语言的优点:
①解释型语言提供了极佳的调试支持。
②解释器比编译器容易实现。
③中间语言代码的大小比编译型可执行代码小很多。例如,C/C++的.exe文件要比同样功能的 Java 的.class文件大很多。
④可移植性好,只要有解释环境,可以在不同的操作系统上运行。比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器系统上运行。
⑤解释型语言也可以保证高度的安全性—这是互联网应用迫切需要的。
解释型语言的缺点:
①运行需要解释环境,程序严重依赖平台。
②运行起来比编译的要慢,占用的资源也要多一些,代码效率低。因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。
③由于解释型应用的decode-fetch-execute(解码-抓取-执行)的周期,它们比编译型程序慢很多。
* 根据语言的结构是否可变 ,编程语言分为 动态语言 和 静态语言 ;
动态语言: 动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了;
静态语言: 静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。优点在于方便阅读,不需要写非常多的类型相关的代码;缺点:自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。(由于类型容易混淆,不容易调试任何类型可以互相赋值的造成的结果);
脚本语言: 又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本保存,只在被调用时进行解释或编译。脚本语言是一种解释性的语言,它不象c/c++等可以编译成二进制代码,以可执行文件的形式存在,脚本语言不需要编译,可以直接用,由解释器来负责解释。
以上所述就是小编给大家介绍的《node学习篇02-模块机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 详解Node模块加载机制
- Node.js 系列 - 模块机制
- [NodeJs系列]NodeJs模块机制
- [NodeJs系列]NodeJs模块机制
- 浅谈node.js模块引入机制
- 深入浅出node.js总结-模块机制(1)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ASP.NET揭秘
Stephen Walther、汤涛 / 汤涛 / 中国电力出版社 / 2004-8-1 / 95.00元
本书是美国亚马逊网站同类书长期销售冠军,并受到微软ASP.NET小组项目经理Rob Howard的大力推荐,中文版由中科院专家汤涛老师翻译,经典、权威是本书最好的诠释。 本书共分10部分,31章,囊括了在.NET框架下架建ASP.NET应用程序的各个层面。每一章也都不是泛泛而谈理论,而是围绕实际样例代码来组织,让读者马上可以上手,并且加深理解。书中还包含了两个完整的、立即就可以用得......一起来看看 《ASP.NET揭秘》 这本书的介绍吧!