类似于Apache
之类的传统服务器软件,都默认提供静态服务,有web
容器和根目录的概念。而对于Node.js
来说,没有web
容器和根目录的概念,所以当使用node.js
来呈递页面时,需要进行顶层路由设计,来把用户访问的url
地址和文件联系在一起。
通过node.js
创建了一个http
服务器,它对前端页面的呈递方式与传统的apache
这类的http
服务器不同。它首先需要进行路由设计,即针对用户不同的url
地址有不同的处理方式,对于前端页面采用fs
模块读文件的方式,读取文件的内容,再设置对应的响应头,再把数据作为响应体返给该页面。
如下所示,在主文件1.js
的同目录下有一个test
的文件夹,里面有一个demo1.html
页面。
这个文件当中为纯的html
代码,没有外链的文件与图片。设计路由为if(req.url == '/fang'){}
,即当用户在浏览器当中输入地址为http://192.168.156.1:3000/fang
时,则呈递这个页面。则进入这个路由选择的if
语句当中,开始用fs
模块读这个demo1.html
文件,在读文件结束的回调函数当中,设置响应头(状态码为200
,返回体的渲染类型为html
),最后再把文件内容作为响应体返回该页面。则1.js
的示例代码为:
const http = require('http');
const fs = require('fs');
const path = require('path');
var server = http.createServer((req,res)=>{
if(req.url == '/fang'){
var targetDemo1 = path.join(__dirname,'./test/demo1.html');
fs.readFile(targetDemo1,(err,data)=>{
if(err) throw err;
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
res.write(data);
res.end();
})
}
});
server.listen(3000,'192.168.156.1');
如上所示,我们对于每一个所要呈递的前端页面都要通过这种方式,为其设计一条路由。如果我们所要呈递的html
页面当中,有外链的图片或者外链的样式表,在该前端的代码里,这些外链文件都是通过相对路径的方式写入的。如下所示:
可以设计路由为if(req.url == '/yuan'){}
,即当用户在浏览器当中输入地址为http://192.168.156.1:3000/yuan
时,则呈递这个页面。则进入这个路由选择的if
语句当中,开始用fs
模块读这个demo2.html
文件,在读文件结束的回调函数当中,设置响应头(状态码为200
,返回体的渲染类型为html
),最后再把文件内容作为响应体返回该页面。但由于node
在呈递页面时没有文件夹的概念,当在解析文本的过程中,当遇到路径,是进行多次路由,多次渲染,当解析至<link rel="stylesheet" href="style.css">
,node
会去寻找req.url='/style.css'
这个路由当中的内容,再渲染到这上面。当解析至<img src="7.png" alt="">
,node
会去寻找req.url='/7.png'
这个路由当中的内容,再渲染到这上面。其中1.j
s当中的示例代码为:
const http = require('http');
const fs = require('fs');
const path = require('path');
var server = http.createServer((req,res)=>{
if(req.url == '/fang'){
var targetDemo1 = path.join(__dirname,'./test/demo1.html');
fs.readFile(targetDemo1,(err,data)=>{
if(err) throw err;
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
res.write(data);
res.end();
});
}else if(req.url == '/yuan'){
var targetDemo2 = path.join(__dirname,'./test/demo2.html');
fs.readFile(targetDemo2,(err,data)=>{
if(err) throw err;
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
res.write(data);
res.end();
});
}else if(req.url == '/7.png'){
var targetImg = path.join(__dirname,'./test/7.png');
fs.readFile(targetImg,(err,data)=>{
if(err) throw err;
res.writeHead(200,{"Content-Type":"image/png"});
res.write(data);
res.end();
})
}else if(req.url == '/style.css'){
var targetCss = path.join(__dirname,'./test/style.css');
fs.readFile(targetCss,(err,data)=>{
if(err) throw err;
res.writeHead(200,{"Content-Type":"text/css"});
res.write(data);
res.end();
});
}else{
res.writeHead(404,{"Content-Type":"text/html;charset=UTF8"});
res.write('嘻嘻,没有这个页面!');
res.end();
}
});
server.listen(3000,'192.168.156.1');
其最后的页面呈递结果为:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。