企业需要
具有服务端开发经验
front-end
back-end
全栈开发工程师
全干
基本的网站开发能力
服务端
前端
运维部署
Java、PHP、Python、Ruby、.Net、、、
Node.js (JavaScript)
Node.js不是一门语言、不是库、不是框架
Node.js是一个Javascript运行时环境
简单点来讲就是Node.js可以解析和执行Javascript代码
以前只有浏览器可以解析和执行Javascript代码
也就是说现在的Javascript可以完全脱离浏览器来运行,一切都归功于Node.js
Node.js中的Javascript
没有BOM、DOM
Ecmascript
在Node这个Javascript执行环境中为Javascript提供了一些服务器基本的操作API
例如文件读写
网络服务的构建
网络通信
http服务器
等处理、、、
构建与Chrome的V8引擎以上
代码只是具有特定格式的字符串
event-driven事件驱动
non-blocking I/O model非阻塞IO模型(异步)
npm是世界上最大的开源库生态系统
绝大多数JavaScript相关的包都存放在了npm上,这样做的目的是为了让开发人员更方便去下载
Web服务器后台
命令行工具
npm(node)
git(C语言)
hexo(node)
游戏服务器、接口服务器
对于前端开发工程师来讲,接触node最多的是它的命令行工具
自己写的很少,
webpack
gulp
npm
《深入浅出Node.js》
朴灵
偏理论
《Node.js权威指南》
API讲解
Javascript标准参考教程(alpha):JavaScript 标准参考教程(alpha) -- JavaScript 标准参考教程(alpha)
Node入门:Node入门 » 一本全面的Node.js教程
《Node.js包教包不会》
B/S编程模型
Browser-server
back-end
任何服务端技术这种BS编程模型都是一样,和语言无关
Node只是作为学习BS编程模型的一个工具而已
模块化编程
RequireJS
SeaJS
@import('文件路径')
以前认知的Javascript只能通过script标签来加载
在Node中可以像@import()一样来引用加载Javascript脚本文件
Node常用API
异步编程
回调函数
Promise
async
generator
Express Web开发框架
Ecmascript6
……
查看当前Node环境的版本号
下载
安装
对于已经装过的,重新安装就会升级
确认Node环境是否安装成功
打开命令行,输入node -v或者node --version
1.创建编写JavaScript脚本文件
var foo = 'hello nodejs' console.log(foo);
2.打开终端,定位到脚本文件所属目录
3.输入node文件名 执行对应的文件
注意:文件名不要使用node.js来命名,最好不要使用中文
Ecmascript
没有DOM、BOM
核心模块
第三方模块
用户自定义模块
Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。
例如文件操作的fs核心模块,http服务构建的http模块,path路径操作模块、os操作系统信息模块。。
var fs = require('fs')
var http = require('http')
读文件
// 浏览器中的JavaScript是没有文件操作的能力的 // 但是Node中的JavaScript具有文件操作的能力 // fs是 file-system的简写 // 在Node中如果想要进行文件操作,就必须引入fs这个核心模块 // 在fs这个核心模块中,就提供了所有的文件操作相关的API // 例如:fs.readFile就是用来读取文件的 // 1.使用require方法加载fs核心模块 var fs = require('fs') // 浏览器不认识node代码 // 2.读取文件 // 第一个参数就是要读取的文件路径 // 第二个参数就是一个回调函数 fs.readFile('./data/demo.txt',function(error,data){ // <Buffer 6e 6f 64 65 6a 73 e8 af bb e5 8f 96 e6 96 87 e4 bb b6> // 文件中存储的是二进制数据 // 所有可以通过toString方法转换 // console.log(data.toString()); if(error){ console.log('读取文件失败'); }else{ console.log(data.toString()); } })
写文件
var fs = require('fs'); // 第一个参数:文件路径 // 第二个参数:文件内容 fs.writeFile('./data/demo.txt','hello everyone!This is nodejs',function(error){ if(error){ console.log('写入失败'); }else{ console.log('文件写入成功'); } })
ip地址用来定位计算机
端口号用来定位具体的应用程序(所有需要联网通信的软件都必须具有端口号)
一切需要联网通信的软件都会占用一个端口号
端口号的范围从0-65536之间
在计算机中有一些默认端口号,最好不要使用
例如http服务的80
可以同时开启多个服务,但一定要确保不同服务占用的端口号不一致才可以
在一台计算机中,同一个端口号
// http这个模块的职责就是帮你创建编写服务器 // 1.加载http核心模块 var http = require('http') // 2.使用http.createServer() 方法创建一个web服务器 // 返回一个Server实例 var server = http.createServer() // 3.服务器作用 // 提供服务: 数据服务 // 发请求 // 接收请求 // 处理请求 // 发送响应 server.on('request',function(){ console.log('收到客户端的请求了'); }) // 4.绑定端口号,启动服务器 server.listen(3000,function(){ console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来进行访问'); })
浏览器发送请求
var http = require('http') var server = http.createServer() // request请求事件处理函数,需要接受两个参数 // Request请求对象 // 请求对象可以用来获取客户端的一些请求信息,例如请求路径 // Response响应对象 // 响应对象可以用来给客户端发送响应消息 server.on('request',function(request,response){ console.log('收到客户端的请求了,请求的路径是',request.url); // response对象有一个方法:write可以用来给客户端发送响应数据 // write可以使用多次,但最后一定要使用end来结束响应,否则客户端会一直等待 response.write('hello') response.write('nodejs') // 告诉客户端,话说完了,可以呈现给用户了 response.end() }) // 4.绑定端口号,启动服务器 server.listen(3000,function(){ console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来进行访问'); })
开启服务器
客户端请求
浏览器响应
根据路径的不同可以响应不同的结果
var http = require('http'); // 1.创建server var server = http.createServer() // 2.监听request请求事件,设置请求处理函数 server.on('request',function(request,response){ console.log('收到请求了,请求路径是',request.url); console.log('请求我的客户端的地址是',request.socket.remoteAddress,request.socket.remotePort); // response.write('hello') // response.write('world') // response.end('hello world') // 根据不同的请求路径发送不同的响应结果 // 1.获取请求路径 // request.url获取到的是端口号之后的那一部分路径 // 也就是说所有的url都是以/开头的 // 2.判断路径处理响应 var url = request.url // if(url === '/'){ // response.end('index Page') // }else if(url == '/login'){ // response.end('login page') // }else{ // response.end('404 Not Fount.') // } if(url === '/products'){ var products = [ { name:'apple', price:5.5 }, { name:'pear', price:4.5 }, { name:'grape', price:8 } ] response.end(JSON.stringify(products)) } }) // 3.绑定端口号,启动服务 server.listen(3000,function(){ console.log('服务器启动成功了,可以访问量...'); })
浏览器解析编码问题
// require // 端口号 var http = require('http') var server = http.createServer() server.on('request',function(req,res){ // 在服务端默认发送的数据,其实是utf8编码的内容 // 但是浏览器不知道你是utf8编码的内容 // 浏览器不知服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析 // 中文操作系统默认是gbk // 解决方法就是正确的告诉浏览器发送的内容是什么编码 // res.setHeader('Content-Type','text/plain;charset=utf-8') // res.end('hello 世界') var url = req.url; if(url == '/plain'){ // text/plain就是普通文本的意思 res.setHeader('Content-Type','text/plain;charset=utf-8') res.end('hello 世界') }else if(url === '/html'){ // 如果发送的是HTML格式的字符串,则也要告诉浏览器发送的是text/html res.setHeader('Content-Type','text/html;charset=utf-8'); res.end('<p>hello html</p><a>点我</a>') } }) server.listen(3000,function(){ console.log('server is running...'); })
fs.readdir 得到目录列表中的文件名和目录名
var fs = require('fs') var resourceDir = 'D:/webpractice/Nodejs/code/resource' fs.readdir(resourceDir,function(err,files){ if(err){ return console.log('文件不存在'); } console.log(files); })
art-template不仅可以在浏览器使用,也可以在node中使用
安装:
npm install art-template --save
该命令在哪执行就会把包下载到哪里。
在Node中使用art-template模板引擎
1.安装
1.在需要使用的文件模板中加载art-template
只需要使用require方法加载就可以了require('art-template')
var template = require('art-template') var fs = require('fs') fs.readFile('./15-在浏览器中使用art-template.html',function(error,data){ if(error){ console.log('文件读取失败'); }else{ var ret = template.render(data.toString(),{ name:'MTING', age:20, hobbies:[ 'reading', 'writting', 'playing' ] }) } console.log(ret); })
参数中的art-temlate就是下载的包的名字
异步由客户端渲染数据
客户端渲染不利于SEO搜索引擎优化
能看到源代码的属于服务器渲染
服务端渲染可以被爬虫抓取到的,客户端异步渲染很难被爬虫抓取到
所有真正的网站既不是纯异步也不是纯服务端渲染
商品列表采用服务端渲染,目的是为了SEO搜索引擎优化
商品评论列表为了用户体验,也不需要SEO优化,所有采用的是客户端渲染
浏览器收到HTML响应内容之后,就要开始从上到下依次解析
当在解析过程中,如果发现:
link
script
img
iframe
video
audio
等带有src 或者href(link)属性标签的时候浏览器会自动对这些资源发起新的请求。
JavaScript Standard Style
爱彼迎JavaScript Style
当采用了无分号的代码风格时,要注意:
当一行代码是以:
( [ `
开头的时候,则在前面补上一个分号避免一些语法解析错误