NodeJS相关笔记(二)

1.世界上最简单的事情就是放弃了,放弃是一件很简单的事情,不放弃是一个很困难的事情。


2.node.js
◆Nodejs是一门技术,javascript是一门语言。
◆Nodejs基于V8的Javascript引擎,好处是不用去考虑兼容性的问题。
◆Nodejs的特点是:异步非阻塞式IO模型、事件驱动机制、轻量高效的。
◆Nodejs可以运行在Windows上也可以运行到Linux上。
◆模块儿系统:【
◇模块儿:一个文件就是一个模块儿
◇每个模块儿的作用域:在一个模块儿内变量、函数、对象都属于这个模块儿,对外是封闭的。
◇require:用来读取js文件,通过require('路径')来引入其它模块儿,返回值是别的模块儿传递过来的module.exprots的值。
◇module.exprots:是每个模块儿最终暴露出去的对象,你如果想暴露出去对象、属性、方法,直接给module赋值即可
◇exprots:是module.exports的一个别名、引用,exports能做的module.exports都可以完成。
◇module.paths:module对象的paths属性记录了,所有的node_modules,也就是Nodejs自带的核心模块儿的文件夹和自定义的特殊文件模块儿的包文件夹,用于在使用require时进行搜索模块儿文件,搜索的时候会先从平级找node_modules文件夹,然后再去找那个文件夹下的package.json文件,看看有没有name值为require中的字符串的值,如果有就这引入这个package.json中main关键字对应的入口文件,如果没有就会去上一层找node_modules,一层一层往上,最后会去找nodejs的安装目录中,还没找到就放弃了。








3.面试的时候,如果面试官不是那么招人恨,千万不要噎死他,噎死他的方式就是使用轻蔑的语气和眼神。


4.nodejs读取文件
◆fs读取文件内容,有回调的是异步,没有回调的是同步【
//引入一个模块儿,模块儿名叫fs
var fs=require('fs');
//异步读文件:    文件名   字符编码  回调函数
fs.readFile('./foo.js','utf8',function(err,data){
console.log(data);
})
//同步读文件: 文件名   字符编码 
var data=fs.readFileSync('./foo.js','utf8')



5.require原理
◆原理是读文件,拼接函数,函数中返回Module.exports,require函数中定义了一个叫Module的构造函数,并且给自己添加了一个exports对象,将读到的文件变成js代码,然后调用拼接好的函数并且传递参数,最后返回一个Module.exports。
◆详细的require与流程的参考资料:http://www.infoq.com/cn/articles/nodejs-module-mechanism/
◆代码【
//模拟require
 function MyRequire(path){
   //定义一个构造函数Module
      function Module(){
           this.exports={}
      }
      
    var fs=require('fs');
   //同步读文件
   //我们读出来的代码source
     var source= fs.readFileSync(path,'utf8');
     //拼接代码变成一个函数的string
    var package='(function(module.exports,module){'+source+' return module.exports;})';
       var packObj=eval(package);


      //调用构造函数创建module
       var module=new Module();
      //   var exports=module.exports   把module.exports当实参传入,exports当形参去接
      var obj=packObj(module.exports,module);


      return obj;
 }
var foo= MyRequire('./foo.js');
console.log(foo());



6.NodeJS模块儿系统
◆模块儿的种类
◇Nodejs自带的核心模块儿(原生模块儿)
◇自定义的文件模块儿(自己加的模块儿),可以用文件来路径加载,也可以像Nodejs自带的核心模块儿直接使用名字来加载,当你的文件路径不包含后缀名,那么NodeJS会按照.js、.node(c++扩展模块儿的文件后缀名)、.json的次序补足扩展名(会直接返回json对象,这也是为什么很多配置文件是json的缘故,加载起来很方便),依次尝试。
◇特殊的文件模块儿,包,当你开一个功能模块儿,还是以文件的形式散列的排布,你给别人使用的时候很麻烦,这时候包的作用就显示出来了,在模块儿的基础上进一步组织Javascript代码。

◆核心模块儿
◇fs(file system 文件有关)
◇http (网站有关)
◇os (操作系统有关)
◇path(路径有关)
◇url(网页地址有关)
◇querystring(和查询有关)
◇...
◆优先从缓存加载
◇优先从缓存加载的规范是由common.js规范设计的,加载后,当再次加载时,去缓存中取module.exports。
◇CMD规范:seajs的规范
◇AMD规范:requirejs的规范
◇common.js规范:node模块儿规范
◇原理:调用require->通过判断字符串,查看是否在文件模块儿缓存区中,如果是就直接返回exports,如果不是->那就判断是否是原生模块儿,如果是那么就去查看原生模块儿的缓存区,如果缓存区中还是没有,那么直接加载原生模块儿,缓存原生模块儿,最后返exports,假如不是原生模块儿->去查找文件模块儿,根据扩展名载入文件模块儿,缓存文件模块儿,最后返回exports。
◇文件路径不要写死,写死就很麻烦,尽量写相对路径。




6.特殊的文件模块儿包
◆包就是一个文件夹,每一个文件夹中,都有一个index.js和package.json,这两个是必须有的。
◆包结构:【
◇package.json:包描述文件,说明文件
◇Bin:存放可执行二进制文件的目录
◇Lib:存放JavaScript代码的目录
◇Doc:存放文档的目录
◇Test:存放单元测试用例的代码
◇规范带来的好处:大家都不要乱来了,都遵守这个规范,当看到一个规范的包目录的时候,会给你一种踏实的感觉。





◆包的描述文件叫package.json:当你开一个功能模块儿,还是以文件的形式散列的排布,你给别人使用的时候很麻烦,这时候包的作用就显示出来了,在模块儿的基础上进一步组织Javascript代码【
◇name:包的名称
◇description:包的简介
◇version:包的版本号
◇keywords:关键词数组,用于在npm网站中分类搜索,当你把你的包放到npm上面去,可以通过这个关键字来进行搜索。
◇author:包的作者
◇main:配置包的入口,默认是模块根目录下的index.js
◇dependencies:包的依赖项,npm会通过该属性自动加载依赖包
◇scripts:指定了运行脚本命令的npmm命令行缩写,例如start
】,这个文件你可以自己写,也可以使用cmd命令/bash命令,npm init,然后按照key:value的方式输入信息,如name:test、version:0.01、description:test、entry point:index.js、test command:、git repository:你的git代码库、keywords:test、author:test、license:MIT、...,最后就会问你是否创建怎么样的一个json文件,之后会生成一个package.json文件,然后你添加一个index.js文件,这样就完美了,但是这上面并没有写包依赖dependencies的key,你可以通过命令 npm install -S  jquery,这样就给你package.json添加了一个dependencies了,依赖jquery,npm install等价于 npm i,dependenciesy用于生产环境,而devDependencies用户开发环境,如果要添加devDependencies,可以使用npm i -D jquery,这样就添加了这样的一个devDependencies,依赖jquery,dependencies表示线上,devDependencies表示线下,有时候需要下载一些调试的包的时候,可以通过npm -i -D 调试包的包名,来下载。
◆dependencies中包的版本号设置【
◇包名:“版本号”,如jquery:">1.10.1"就是下载大于1.10.1的最新版本、jquery:"*"就是下载最新版本的,版本号一般都是有两个点三个位,1.10.*和1.*代表的含义是不样的,1.10.*表示第三个位上最新的版本,而1.*表示后两个位上最新的版本。
◇> +版本号   下载大于某个版本号,npm会下最新版
◇< +版本号   下载小于某个版本号,npm会下小于这个版本号最新版
◇<= 小于等于 一定会下你写的这个版本,除非没有你写的这个版本
◇>= 大于等于  下载最新版
◇*、" "、X  任意 npm会给你下最新版
◇~ +版本号  会去下约等于这个版本的最新版,在大版本不变的情况下下一个比较新的版本,也就是第一个位不变。
◇^ +版本号  不跃迁版本下载,^2.1.0 npm会下载大版本不变,去下载2.x.x版本里的最近版
◇参考文献 package.json全字段解析,http://blog.csdn.net/woxueliuyun/article/details/39294375

◆包引用:将node_modules文件夹放到平级目录,这个文件夹中每一个文件夹都是一个包,包里面包含了index.js和package.json,index.js就是入口文件,当你引入这个包的时候,实际上就是引入index.js这个文件,比如包名叫做test,那么你就可以这样引入,require('test'),这样你就可以获得node_modules文件夹中的test文件夹中入口文件给你返回的值了,入口文件里面也是通过Module.exports来向外暴露值。
◆将常用的文件变成模板:npm install -g fast-init,下载一个这样的软件,f -h,就会有使用的提示




7.npm基本使用命令
◆npm init  【-y】:初始化一个package.json文件
◆npm install 包名:安装一个包
◆npm install –-save 包名:将安装的包添加到package.json的依赖中(dependencies),等价于npm i -S 包名。
◆npm install -save-dev 包名:将安装的包添加到package.json的依赖中(devDependencies),等价于npm i -D 包名
◆npm install –g 包名:安装一个命令行工具
◆npm install 包名 –f或者—force 强制重新安装
◆npm docs 包名:查看包的文档【非常有用】,通过这个命令打开 包相对应的文档
◆npm root -g:查看全局包安装路径
◆npm config set prefix “路径”:修改全局包安装路径
◆npm list:查看当前目录下安装的所有包
◆npm list -g:查看全局包的安装路径下所有的包,但是递归查看的,子文件太多了,最好使用npm list -g --depth 0,这样就只会看到所有的主包,不会递归查看所有的子包。
◆npm uninstall 包名:卸载当前目录下某个包
◆npm uninstall –g 包名:卸载全局安装路径下的某个包
◆npm update 包名:更新当前目录下某个包
◆npm update –g 包名:更新某个全局工具包
◆npm update:更新当前目录下安装的所有包
◆npm update –g:更新全局所有的工具包
◆安装不同版本
◇npm install sax@latest
◇npm install [email protected]
◆查看全局包安装路径:npm root –g
◆修改全局包安装路径:npm config set prefix “c:\dev\nvm\npm”,避免每次切换版本都要重新安装全局包,不建议使用,建议去文件夹里面改 C:\Users\用户名,里面有一个 .npmrc文件 ,去里面改prefix = C:\dev\npm  (写你的路径),去全局的环境变量path里把C:\dev\npm  路径加进去
◆参考资料:npm的命令(https://docs.npmjs.com/)


8.npm的使用(npm:基于包的规范来实现的一个包管理工具)
◆基于Node.js开发的包的托管网站,也是Node.js包管理工具。
◆bower会下载到指定的目录下,npm必定会下载到node_modules目录下。
◆npm install 包名:当执行npm install的时候,它会自动跑到npm的网站,然后找到该包的github地址,
找到之后,下载这个压缩包,然后再执行npm install的当前目录下找一个叫做node_modules目录,如果找到,直接解压这个压缩包到node_modules目录下,如果找不到,则新建一个node_modules目录,解压到该目录。
◆npm install -g 包名:表示全局安装,npm在安装的时候,在全局设置了一个安装目录,只要是全局安装就会把包安装到这个目录里面去,只要是全局安装就是安装命令行工具,可以在命令行工具里面输入对应的命令。
◆npm install 缩写 npm i:当执行npm install的时候,会自动在当前目录中查找package.json文件,如果找到,找里面的 dependencies 字段和devDependencies,安装该字段中所有依赖的项。
◆npm docs 包名:通过这个命令打开既包相对应的文档,会打开对应包的官网网站或者打开github里面Readme.md文件写的代码库,如jquery.com、https://github.com/xxx/xx/xx。
◆npm install --save (生产环境):npm i -S jquery@3.*,在做项目的时候,先初始化一个package.json文件,在安装第三方包依赖的时候,必须使用npm install --save express,添加依赖项到package.json文件中,实际就是添加到dependencies字段中。
◆npm install -save-dev (开发环境):npm i -D jquery@3.*,在做项目的时候,先初始化一个package.json文件,在安装第三方包依赖的时候,必须使用npm install -save-dev express,添加依赖项到package.json文件中,实际就是添加到devDependencies字段中。
★npm 这种东西的最终的目的就是:让你的开发模式工程化,都依靠工具来管理。



9.只有你将你的包上传到npm官网上时,你才能够通过npm下载你的包,上传的时候,npm_modules文件夹不会上传,其它的文件都会上传,记住如果npm_modules中有什么包,一定要写到package.json的两个依赖dependencies和devDependencies里面去,否则,你的包就有问题了,npm只有一个分支,测试版本你可以放到github上,测试完毕之后,可以正常使用了再放到npm上,因为npm上删不了,只能够用新的版本覆盖旧的版本,package.json文件中不能加注释。


10.nodejs怎么体现水平有多高,你说你自己有好多好多年的经验,别人不信,你知道的包越多、你越会用别人的包,就能够说明你的水平有多高了,nodejs开发要注重包的积累【
◆http-poster:这个包是用来发送ajax请求的,这是传智博客一位老师写的。


】。


11.dns的墙
◆dns服务器是运营商提供的,小的运营商会连到大运营商的服务器,dns里的数据是key/value结构的,域名:ip地址。
◆浏览器地址栏输入域名后,浏览器会先去本地磁盘的hosts文件中去找,找到了之后会去对应的ip然后得到网站。
◆如果你的ip地址进入了运营商服务的黑名单,那么你就不能去dns服务器里面去找到对应域名的ip地址,相当于运营商给你设置了一道墙,也叫你的ip被墙了。
◆代理服务器,代理服务器就是代理你去发送请求,并把数据返回给你。
◆代理服务器软件,GreenVPN,需要充值,一年一两百这样,每个月十几二十块钱。


12.nrm:npm的数据源管理工具
◆淘宝做了一个npm的镜像,镜像并不是实时的,差十分钟,每十分钟都会淘宝都会去npm请求一次
◆nrm的数据源管理,也就是说,如果你通过npm下载软件的时候很慢,那么你可以去切换其它的数据源,也就是其它的代理服务器,如果淘宝做的npm的镜像,你去请求淘宝服务器。
◆nrm安装: npm install -g nrm
◆nrm ls:查看npm的所有代理服务器,并且可以看到当前使用的数据源是谁的。
◆nrm test :查看npm的代理服务器的下载速度
◆nrm use taobao:表示切换到淘宝的代理服务器,比可以通过ls 和test你可以看到所有的代理服务和他们的下载速度,数据源切换完了别忘了,其它代理服务器与npm官方服务器相隔10分钟。


13.cnpm的使用
◆cnpm和npm差不多一样,使用的方式也差不多一样。
◆安装cnpm:npm install -g cnpm --registry=https://registry.npm.taobao.org
◆cnpm的使用方式:cnpm install 包名,其它命令基本一样,一般在安装包的时候使用它就可以了。
◆cnpm使用的是淘宝的镜像。


14.文件操作
◆箭头函数=>,类似C#的 goes to,是ECMAScript6的语法,也是一个语法糖,让函数写起来变得特别简单【
//正常写一个函数是这样的
var foo=function(v){
return v;
}
//使用箭头函数后,可以这样写一个函数
var foo=v=>v;//第一个v表示传递进去的参数,=>v表示返回值是v
//也可以这么写
var foo=(v)=>{return v};


//有多个参数没有返回值的正常函数
var fo1=function(v,u){
}
//使用箭头函数后
var fo1=(v,u)=>{};

◆fs.readFile() 读文件【
fs.readFile(file, [options], callback)
//file 读文件的路径
//options 用[]包裹的可选参数,object {"encoding":"uft8","flag":"r"}  string 'utf8'
//callback function  callback函数里面有两个参数 
//err表示错误对象,如果readFile发生错误了,在callback函数里面会回返回err,err对象里面存着错误信息
//如何读文件成功,err为null
//data就是读文件,读出来的内容。

◆fs.access(path,[mode], callback) 用来判断文件是否存在【
//path 判断路径是否正确(也可以判断文件)'./pic'
//mode一般不用,默认就可以了,用的话是用来判断文件是否可读可写可执行,一般用于linux系统,关于文件的权限,windows系统下可以不写
//callback 只有一个参数err,错,文件有问题




14.vsc
◆vsc教程[http://i5ting.github.io/vsc/](vsc教程)




















猜你喜欢

转载自blog.csdn.net/jwllwj_2018/article/details/80748220