node学习篇02-模块机制

一、BS or CS ?

        C/S即Client/Server,客户机/服务器模式。

        两层:客户机和服务器两层,第一层,在客户机系统上结合了界面显示与业务逻辑;第二  层,通过网络结合了数据库服务器。


          特 点:如果用户要使用的话,需要下载客户端,安装后就可以使用

          优缺点:界面和操作可以很丰富;两层传输,安全性高;只有一层交互,响应速度快。一般在局域网中,适用面窄;需安装,用户群固定;升级成本高,发生一次升级,所有程序都需要更新。

         B/S全称为Browser/Server,即浏览器/服务器结构。

         三层:表现层主要完成用户和后台的交互及最终查询结果的输出功能;逻辑层主要是利用服务器完成客户端的应用逻辑功能;数据层主要是接受客户端请求后独立进行各种运算。 


         优缺点:无需安装客户端,有浏览器即可; 架构在广域网上,交互性强;更新迭代方便,只需更新服务器即可。跨浏览器适配问题;中间层较多,速度和安全性问题;请求响应的交互模式,需要刷新页面,不友好。

          架构形式:客户端-服务器-数据库;

                            客户端-web服务器-应用服务器-数据库

                            客户端-负载均衡器(Nginx)-中间服务器(Node)-应用服务器-数据库

二、JavaScript发展历程

       工具类库-〉组件库-〉前端框架-〉前端应用(不断抽象类化的过程)

       暴露的问题:缺乏模块。通过script方式引入代码杂乱无章。

       Javascript规范:CommomJs

三、CommonJs规范

      Javascript缺陷:没有模块系统;标准库较少;没有统一标准接口;缺乏包管理系统。

      CommonJs目的:希望javascript能够在任何地方运行。使javascript能编写服务端应用程序,命令行工具,桌面应用程序,混合应用。

      Node借鉴了commonJsmodules规范。

      规范:引用: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文件,就是经过编译后的源代码。源代码编译生成机器语言,再由机器运行机器码(二进制)。


      解释:将源代码逐条转换成目标代码,同时逐条运行的过程,解释是每次程序运行是随翻译执行(类似英文的同声传译)。程序时要由解释器程序实时地将源代码转换成二进制形式运行。



##语言分类

*根据解释和编译两种执行方式,编程语言分为解释型语言编译型语言

编译型语言的优点:运行速度快,代码效率高,编译后程序不可以修改,保密性好。

编译型语言的缺点

  1. 代码需要经过编译方可运行,可移植性差,只能在兼容的操作系统上运行。
  2. 安全性不如解释性语言,一个编译型的程序可以访问内存的任何区域,并且可以对你的PC做它想做的任何事情(大部分病毒是使用编译型语言编写的)。

  解释型语言的优点:

    ①解释型语言提供了极佳的调试支持。

    ②解释器比编译器容易实现。

    ③中间语言代码的大小比编译型可执行代码小很多。例如,C/C++的.exe文件要比同样功能的Java的.class文件大很多。

    ④可移植性好,只要有解释环境,可以在不同的操作系统上运行。比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器系统上运行。

    ⑤解释型语言也可以保证高度的安全性—这是互联网应用迫切需要的。

    解释型语言的缺点:

    ①运行需要解释环境,程序严重依赖平台。

    ②运行起来比编译的要慢,占用的资源也要多一些,代码效率低。因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。

    ③由于解释型应用的decode-fetch-execute(解码-抓取-执行)的周期,它们比编译型程序慢很多。

*根据语言的结构是否可变,编程语言分为动态语言静态语言

    动态语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了;

    静态语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。优点在于方便阅读,不需要写非常多的类型相关的代码;缺点:自然就是不方便调试,命名不规范时会造成读不懂,不利于理解等。(由于类型容易混淆,不容易调试任何类型可以互相赋值的造成的结果);

    脚本语言:又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本保存,只在被调用时进行解释或编译。脚本语言是一种解释性的语言,它不象c/c++等可以编译成二进制代码,以可执行文件的形式存在,脚本语言不需要编译,可以直接用,由解释器来负责解释。

          










转载于:https://juejin.im/post/5d079112f265da1b8b2b5f2a

猜你喜欢

转载自blog.csdn.net/weixin_33795806/article/details/93178545
02-