1.web服务器开发
1.1.IP地址和端口号
-
IP地址用来定位计算机
-
端口号用来定位具体的应用程序
-
一切需要联网的通信软件都会占用一个端口号
-
端口号的范围从0-65536之间
-
在计算机中有一些默认端口号,最好不要去使用
- 例如HTTP服务的80
-
我们在开发过程中使用一些简单好记得就可以了,例如3000、5000
-
可以开启多个服务,但是在一台计算机
-
获取请求者的端口号:req.socket.remoteAddress, req.socket.remotePort
var http = require('http')
var server = http.createServer()
server.on('request',function(req, res){
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('hello nodejs')
})
server.listen(3000,function(){
console.log('Server is running...')
})
- 在服务器默认发送到数据,其实是utf-8编码的内容,解决方法:正确告诉浏览器我给你发送的内容
res.setHeader('Content-Type','text/plain; charset=utf-8')
- 类型:
text/plain
普通文本text/html
html格式image/jpeg
图片(图片不需要指定编码,去掉utf-8
data
默认是二进制数据,可以通过.toString
转为咱们能识别的字符串res.end()
支持两种数据类型,一种是二进制,一种是字符串
代码风格
- 当你采用了无分号的代码风格时,只需要注意以下情况
- 当一行代码是以
- (
- [
- `
- 开头的时候,则在前面不上分号
- 所以你会发现在一些第三方代码中能看到一个上来就以一个
;
开头。
- 当一行代码是以
2.Apache
var wwwDir = 'c:/www/'
server.on('request',function(req,res){
var url = req.url
var filePath = '/index.html'
if(url !== '/'){
filePath = url
}
fs.readFile(wwwDir + filePath, function(err,data){
if(err){
return res.end('404')
}
res.end(data)
})
})
-
如何得到wwwDir目录列表中的文件名和目录名
fs.readdir
-
如何将得到的文件名和目录名替换到
template.html
中- 在
template.html
中余姚替换的位置预留一个特殊的标记(就像以前使用 的模板引擎的标记一样(>_<) - 根据
files
生成需要的HTML
内容 - 在
ES6
的 ` 字符串中,可以使用 ${} 来引用变量
- 在
-
art-template
模板引擎- 下载
npm install art-template
- 该命令在哪里执行就会下载到哪里。默认会下载到
node_modules
目录中 node_modules
不要改,也不支持改- 在浏览器中需要引用
lib/template-web.js
文件 - 强调:模板引擎不关心你的字符串内容,只关心自己能认识的模板标记语法,例如
{{}}
被称为mustache
八字胡语法
- 下载
-
在Node中使用 art-template 模板引擎;模板引擎最早就是诞生于服务器领域,后来才发展到了前端
-
安装
npm install art-template
-
在需要的文件模块中加载
art-template
- 只需要使用
require
方法加载就可以了 :require('art-template')
- 参数中的
art-template
就是你下载的包的名字 - 也就是说你
install
的名字是什么,则你require
中的就是什么 - 发送解析替换过后的响应数据
- 只需要使用
-
-
-
查文档,使用模板引擎的API
-
语法:
template.render('模板字符串',替换对象)
-
服务端渲染,本质就是字符串解析替换
3.Node中的模块系统
使用Node编写应用程序主要就是在使用
- EcmaScript语言
- 和浏览器不一样,在Node中没有BOM,DOM
- 核心模块
- 文件操作的fs
- http服务的http
- url路径操作模块
- path路径处理模块
- os操作系统信息获取模块
- 第三方模块
- art-template
- 自己写的模块
- 自己创建的文件
3.1.什么是模块化
- 文件作用域
- 通信规则
- 加载require
- 导出
3.2. CommonJS模块规范
在Node中的JS还有一个很重要的概念,模块系统
- 模块作用域
- 使用require方法用来加载模块
- 使用exports接口对象用来导出模块中的成员
3.2.1.加载 require
- 语法:
var 自定义变量名 = require('模块')
- 两个作用:
- 执行被加载模块中的代码
- 得到被加载模块中的
exports
导出接口对象
3.2.2.导出
-
Node中是模块作用域,默认文件中所有的成员只在当前文件模块有效
-
对于希望可以被其他模块访问的成员,我们就需要把这些公开的成员都挂载到
exports
接口对象中就可以了 -
导出多个成员:
-
必须是对象
-
exports.a = 123 exports.b = 'hello' exports.c = function(){ console.log('ccc') } exports.d = { foo : 'bar' }
-
-
导出单个成员:
-
拿到的就是:函数或者字符串
-
module.exports = 'hello'
-
以下情况会覆盖
-
module.exports = 'hello' module.exports = function(x,y){ return x+y } //后者会覆盖前者
-
也可以这样导出多个成员
-
module.exports = { add:function(){ return x+y }, str : 'hello' }
-
3.2.3.原理解析
-
在一个Node中,每个模块内部都有一个自己的module对象
-
该 module 对象中,有一个成员叫:exports 也是一个对象
-
也就是说如果你需要对外导出成员,只用把导出的成员挂载到module.exports中
-
我们发现每次导出接口成员的时候都需要
module.exports.xxx = xxx
很麻烦 -
专门提供变量:
var exports = module.exports
-
var fooExports = require('./foo') console.log(fooExports)
-
var module = { exports:{ foo: 'bar' add: function } } module.exports.foo = 'bar' module.exports.add = function(x,y){ return x + y } //谁require,谁就得到这个 module.exports 这个接口对象 //默认在代码的最后有一句 return module.exports
-
-
exports 和 module.exports 的一个引用
-
console.log(exports === module.exports)//=> true exports.foo = 'bar' //等价于 moudle.exports.foo = 'bar'
-
给 exports 赋值会断开和 module.exports 之间的引用
-
同理,给 module.exports 重新赋值也会断开
-
-
真正去使用的时候:
- 导出多个成员:exports.xxx = xxx
- 导出多个成员也可以:module.exports = {}
- 导出单个成员:module.exports
- 如果实在分不清就只使用 module.exports 也没问题
- module.exports.xxx = xxx
- module.exports = {}
3.3
- exports是一个对象,我们可以通过多次为这个对象添加成员实现对外导出多个内部成员
- 如果一个模块需要直接导出某个成员,而非挂载的方式
- 必须
module.exports = add