nodejs学习(一)

学习nodejs的原因:一是有需求,工作需要;二是之前在前端有接触过,也有了解到nodejs的一些知识。

下面会对前端中依赖于node或者跟node相关的东西做一些整理,当然不够全面,主要是拿一些常用的进行对比跟分析:

一、自动化构建工具  gulp   webpack  grunt

  • gulp ---用于构建项目,进行压缩合并。其核心文件是gulpfile.js; 核心API语法有dist  watch  default   task pipe  ;gulp提供了丰富的插件库 sass  less  uglify等等
  • webpack ------用于构建项目,整合模块,把浏览器不识别的语言(es6/babel)转换成浏览器识别的语言。主要依赖于webpack.config.js,其核心组成部分有:entry   output   moudle/rules    plugins   devserver等;webpack提供了丰富的加载器(loader)------url   babel     file     sass(对静态资源文件做管理)

注:在项目中,webpack和gulp可以同时来使用

二、css预处理器   sass  less

Sass是基于Ruby环境的,诞生于2007年,其本身的语法并不太容易让浏览器识别,但最后还是会编译出合法的CSS让浏览器使用。许多框架和工具中会用到它(如:ionic     mintui)

less  是基于JavaScript环境的,2009年开源的一个项目,LESS提供了多种方式能平滑的将写好的代码转化成标准的CSS代码,很多流行框架及工具会用到它(如Bootstrap)

更多请看:css预处理器

三、版本管理工具   git     svn

git ------分布式管理,最大的特点是可以构建多个分支

svn -----集中式管理,必须要联网才能进行

注:一般的话,一个公司会选择用一个版本管理工具

更多请看:git与svn对比

四、es5    es6    es7

在es5中,

  • var  声明可以定义、修改变量,没有值会返回一个undefined
  • 用字符串的拼接:“”+变量+“”
  • 函数this指向      function -----谁调用指向谁,没人调用指向window
  • 对象               字面量    构造函数      原型    混合----------继承:原型继承        原型链继承     call  apply  

在es6中,

  • let  块级作用域  ;   const    用于声明变量
  • 新增数组map    forEach     [...]等方法
  • 提供了模板字符串:  `  `    ${}
  • 函数this指向    ()=>{}   -----this指向父级
  • 对象              class类------继承:extends

注:模块的暴露和接收

五、模块开发的规范   AMD    CMD   commonjs规范

AMD--------------异步加载规范,核心是依赖提前引入,代表框架require.js

CMD-------------标准通用规范,核心是模块按需引入,代表框架是sea.js

commonjs-------------谷歌提供的规范,核心是模块的接收和暴露(require/import   module.exports/export)

六、测试工具  mocha  karma

先弄清测试、调试、联调三个概念

  • 测试: 通过专门的测试工具/ 代码  对功能/项目进行整体测试(黑盒测试/白盒测试)--线下  线上--(一轮 二轮  三轮)需要写测试用例
  •  调试:控制台  打断点
  •  联调:前端与后端的交互   测试的是 后端的数据有没有问题network

目前能想到的就这些,还有一些其他的日后再说。

学习一个新事物,肯定是从听说到了解,再通过学习训练达到熟悉和熟练的一个阶段,在理论和实战都十分强的情况下,最后通过不断训练不断学习不断思考总结,才可能达到精通的地步。下面就node的一些基本知识做一个了解:

一、node是什么

nodejs是一个基于Chrome   v8引擎的JavaScript运行环境。它使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。

注:1.事件驱动:事物在执行过程中用于决策的一种策略,跟随当前时间点上出现的事物,调用一切可调用的资源该事物,使其不断出现的事物被处理  防止事物堆积。

        2.非阻塞式:i(input输出/写入)/o(output输出/写出)

        3.nodejs由C++语言编写

        4.nodejs的包管理器npm  ----------- 关于包管理器

            包管理器  npm  cnpm yarn
            相同点: 追踪package.json 进行依赖安装(npm init)

  •              cnpm 是npm的镜像(实际项目开发  不推荐cnpm 因为会生成多余的依赖文件;当依赖过大,比较吃网络的情况下   使用cnpm镜像) 
  •              npm -- npm install   //npm一个依赖接一个依赖进行安装,依赖信息会全部打印出来/安装过的再次安装会重新下载 
  •              yarn-- yarn add  //并行安装 安装信息一emoji表情做展示 /安装过的再次安装  不会重新下载

        5.简单来说,nodejs是一个编写高性能网络服务器的JavaScript工具包(用于js开发服务端程序),使用的是单线程、异步、事件驱动的一个模式。

二、node的特点

快、耗内存多

三、node与PHP相比的一些优缺点

  • 优点:

            性能高

            开发效率高

            应用范围广

  • 缺点:

              新、会的人少

             中间件少(函数)

              IDE(编辑器)不完善

四、node的一些基本API

  • url模块

      提供的方法:

        url.parse(urlString)     url路径转换成url对象信息,用于查询url信息

        url.format(urlObject)       将url对象信息转换解析成正常的url地址

        url.resolve(from,to)           将两个url地址解析成一个完整的url路径,   from通常跟URL前,to  通常跟path路径  

//首先一定要引入模块
var url = require("url");

console.log(url.parse("http://localhost:3000#aaa/hh?id=name"))


var str ={
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'localhost:3000',
  port: '3000',
  hostname: 'localhost',
  hash: '#hh?id=name',
  search: null,
  query: null,
  pathname: '/aaa',
  path: '/aaa',
  href: 'http://localhost:3000/aaa#hh?id=name' 
}

console.log(url.format(str))

console.log(url.resolve("http://localhost:3000","/aa?id=name"))
  • querystring模块

用于解析与格式化 URL 查询字符串,提供的方法有:

var querystring = require("querystring");
//querystring.escape()汉字编码,将汉字编码成计算机识别的语言
console.log(querystring.escape("哈哈哈"))
//querystring.unescape() 汉字解码,将计算机语言解码成中文
console.log(querystring.unescape("%E5%93%88%E5%93%88%E5%93%88"))
//querystring.stringify()  将对象转换成字符串,逗号用&连接起来
console.log(querystring.stringify({"name":"ls","age":"22"}))
//querystring.parse()  将字符串转换成对象
console.log(querystring.parse("name=ls&age=22"))
  • events模块
var  EventEmitter  = require("events");
//EventEmitter   -   类  原型上  提供两种方法  on(进行事件,数据接收)  emit(进行事件,数据推送)

//定义类
class  Person extends  EventEmitter{};
//实例化
var person = new Person();
//定义后,可以多次触发
person.on('事件名',(data)=>{
	console.log(data)
})

//emit只触发一次
//person.once('事件名',(data)=>{
//	console.log(data)
//})

person.emit('事件名','hello-----大白')
person.emit('事件名','hello----小可爱')
  • fs模块
var fs = require("fs");
//获取文件的一些信息  
fs.stat("./qs.js",(err,data)=>{
	console.log(data.isFile())  //true
})
//新增目录
fs.mkdir("dist",()=>{
	console.log("success")
})
//书写文件
fs.writeFile("./dist/c.js","console.log('ccc');",()=>{
	console.log("success")
})
//追加文件内容
fs.appendFile("./dist/a.js","console.log('bbb')",()=>{
	console.log("success")
})
//读取文件的内容
fs.readFile("./dist/a.js",(err,data)=>{
	console.log(data.toString()) //data----><Buffer 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 6c 65 2e 6c 6f 67 28 27 62 62 62 27 29>
})
//列出目录的东西
fs.readdir("./dist",(err,data)=>{
	console.log(data)
})
//重命名目录或文件
fs.rename("./dist/a.js","./dist/b.js",()=>{
	console.log("success")
})
//删除目录(rmdir)与文件(unlink)
fs.unlink("./dist/b.js",()=>{
	console.log("success")
})
fs.rmdir("./dist",()=>{
	console.log("success")
})
//注:rmdir只能删除空文件夹,下面是删除整个目录的写法
fs.readdir("./dist",(err,data)=>{
	data.map(function(item){
		fs.unlink("./dist/"+item,()=>{
			fs.rmdir("./dist",()=>{
				console.log("success")
			})
		})
	})
})
//同步读取目录信息
console.log(fs.readdirSync("./dist"))//[ 'a.js', 'b.js', 'c.js' ]

注:终端里面不能执行多行的表达式 ,但是终端可以进行简单逻辑计算,可以url.parse()、url.resolve()、 url.format(),只是都是在node环境下,先进入node环境,再执行这些逻辑计算。

       错误优先回调函数-- 函数先执行错误判断  函数第一个参数为错误对象  第二个参数是正常数据

五、node可以做什么

node.js可以用来解析JS代码(没有浏览器安全级别的限制),提供了很多系统级别 的API,如:文件的读写,进程的管理,网络通信等。-----搭建服务器

学习node.js 可以辅助前端开发,代替后端开发。

六、node的安装

  • nodejs安装版本

        v6.9.4 LTS(长时间支持版本——-推荐) 

        V7.6.0 Current(最新版本,有些api会有变动)

注:中间为偶数位的是稳定版(推荐使用),为奇数位的是非稳定版本

  • nodejs安装方法

下载安装包,然后小黑窗执行以下代码:

         npm i xxx -g(只需要安装一次)
         npm i xxx --save-dev/-D/-S(项目依赖  哪一个项目用就安装)
         npm i [email protected] -D(指定版本安装)

接下来就是用nodejs搭建我的第一个服务器,代码如下:

//搭建一个地址为http://localhost:3000的服务器

var http = require("http"); //引入node原生模块
var hostname = "localhost";  //主机名
var port = 3000;             //端口号


 //创建服务器  req:请求对象  res:响应对象
http.createServer((req,res)=>{

    //1.charset=utf-8主要是解决中文乱码问题;2.要用单引号,双引号不起作用
	res.setHeader('content-type','text/html;charset=utf-8')
	
	res.statusCode=200;
	
//	console.log(req.url);   //向服务器请求的地址路径
	
	if(req.url!="/favicon.con"){
		//写入响应信息
		res.write("hi");
        say(req,res);
		//响应结束
		res.end();	
	}

	
	//域名端口号的监听
}).listen(port,hostname,()=>{
	console.log(" 服务器已开启http://localhost:3000")
})



function say(req,res){
	res.write("你好啊 ---")
	res.end()
}

写入数据信息除了在res.write()里面写入之外,还有两种写法:

一个是直接在下面写个函数,通过函数调用的方式,如上面say()函数的调用;

第二种是引入外来文件,如common.js

var hs = {
	fn1:function(req,res){
		res.write("hello");
		res.end()
	},
	fn2:function(req,res){
		res.write("hi");
		res.end()
	}

}

//commonjs规范
module.exports = hs

然后在源文件server.js里面引入,再调用

//引入写法
var hs = require("./common")

//调用写法

if(req.url!="/favicon.con"){
	res.write("2");
	hs.fn1(req,res);
	res.end();	
}

上面搭建的方法比较复杂,下面是node搭建服务器的简洁写法

var  http = require("http");

http.createServer((req,res)=>{
	
	res.writeHead(200,{"content-type":"text/html;charset=utf-8","Access-Control-Allow-Origin":"*"})
	
	if(req.url!="/favicon.ico"){
		
		res.write("hello");
		res.end();
	}
	
}).listen(3000)

注:

1、nodejs的三大模块分别是:内置模块(原生模块)、依赖模块、自定义模块。其中,内置模块不需要安装依赖,如http等;

自定义模块通过“./a.js”这种模式引入。

2、安装热更新:npm install supervisor -g    

      启动    supervisor xxxx.js   可以不用执行node,自动更新(supervisor )

七、前端从服务器请求数据展现于页面

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>请求数据</title>
		<script src="jquery-1.11.0.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
	
		<button id="btn">请求数据</button>
                <p></p>
		
	</body>
	<script type="text/javascript">
		$("#btn").click(
			function(){
				
				$.ajax({
					type:"get",
					url:"http://localhost:3000",
					success:function(data){
						//console.log(data)
                                             $("p").text(data)
					}
				});
			}
		)
	</script>
</html>

八、node可以选择搭配的一些框架

  • Express(sails): 完善、稳定、文档全、社区大
  • Koa: 超前
  • Hapi:复杂(一个简单的helloworld都要做很多堆砌),适合复杂的大型项目

​​​​​​​

猜你喜欢

转载自blog.csdn.net/keep789/article/details/81451353