nodejs抓取动态网页(网上提了个问:Express4开发的动态页面访问好慢的说?)

优采云 发布时间: 2021-10-02 12:31

  nodejs抓取动态网页(网上提了个问:Express4开发的动态页面访问好慢的说?)

  上周在MOOC网站问了一个问题:Express4开发的动态页面访问有多慢?不幸的是,我没有得到可行的答案。周末折腾了一下,把小站(花满楼)的所有页面都静止了;仔细想想,这并不是一个特别标准的做法。, 不过折腾了这么久,终于有了解决这个问题的办法,还是有些欣慰的;

  一开始页面是动态的,由jade模板渲染,但是不明白为什么不管页面的内容,打开都需要至少一秒。. . ; 后来特地做了一个站点作为静态资源站,缓存和gzip(Nodejs搭建静态资源服务器和文件上传);OK,现在静态资源没有大问题;但是页面打开速度不理想,那就后台再按一下,来app.use(compress()); 事实证明,没有明显的效果;刚学Nodejs就郁闷,所以遇到这个无语的问题,百度了好久,哈哈。. . 最后,我只想到了一种方法。参考静态资源站点,将jade编译成html,将动态页面转成静态资源。它会像加载静态资源一样快吗?答案是肯定的!!!

  就我的博客站点而言,我现在面临两个问题:一是直接编译原玉保留动态数据;另一种是去除动态数据编译成html,在ajax页面加载后请求数据;我选择前者,因为它可以在静态页面上保持最新的数据,而后者是js渲染的,对SEO非常不利;哈哈,其实这两种方法我都没有用过,因为在这个层面上,在express框架中,没听说过这种方法,自然下不来,只是一个理想的可行方案;

  我该怎么办?好吧,原谅我选择放弃express的内置模板。经过一番整理,Gulp(gulp-jade模块)直接将那些jade全部编译成html(前端自动化的神器-Gulp)。我想是这样。编译后的 html 用作类似模板的模块。数据还是像之前一样在路由中取,将获取到的数据作为变量传递给html模板模块对应的接口,然后返回的html生成为一个真正的静态页面,这样,在路由器不变的情况下,直接生成原玉到对应目录;如上所述,页面需要像静态资源一样加载才能快速;

  Gulpfile.js

  var jade=require('gulp-jade');

gulp.task('jade',function() {

gulp.src('./views/bokeDetail.jade')

.pipe(jade({pretty:true}))

.pipe(gulp.dest('./public/famanoder/'));

});

  bokeDetail.templ.js

  var html=function(id,title,subtitle,time,from,contents){

//传递动态数据

return ''+动态数据+'';

}

//片段,实际情况而定

  module.exports=html;

  bokeDetail.js(路由器)

  //......

//引入对应静态模块

var boketempl=require('./templs/bokeDetail.templ.js);

//依旧读取数据

//传递数据:如,id,title,content,comments

//生成静态页面到指定目录

function createStaticPage(id,title,content,comments,fn){

var path='./public/famanoder/';

var html=boketempl(id,title,content,comments);

var ws=fs.createWriteStream(path+id+'.html');

ws.write(html,function(err) {

console.log('writePage:'+path+id+'.html');

fn&&fn();

});

ws.on('drain',function() {

ws.end();

});

}

  ok,程序执行后会生成静态页面,动态数据放到public下的famanoder目录下;下面是将响应直接指向bokeDetail.js(路由器)中上面生成的静态页面;

  var pathname=url.parse(req.url).pathname;

var realpath='./public/famanoder/'+pathname.substr(pathname.lastIndexOf('/')+1)+'.html';

var type='text/html';

var extname='html';

fs.exists(realpath,function(exist){

if(!exist){console.log(101);

res.writeHead(404,{

'content-type':'text/plain'

});

res.write('The Resourse '+pathname+' was Not Found!');

res.end();

}else{

fs.readFile(realpath,'binary',function(err,file){

console.log(11);

if(err){

res.writeHead(500,{

'content-type':'text/plain'

});

res.end();

}

if(extname.match(config.fileMatch)){

var expires=new Date();

expires.setTime(expires.getTime()+config.maxAge*1000);

res.setHeader('Expires',expires.toUTCString());

res.setHeader('cache-control','max-age='+config.maxAge);

}

fs.stat(realpath,function(err,stat){

var lastModified=stat.mtime.toUTCString();

res.setHeader('Last-Modified',lastModified);

if(req.headers['if-modified-since']&&lastModified==req.headers['if-modified-since']){

console.log(0);

res.writeHead(304,{

'content-type':type

});

res.end();

}else{

var raw=fs.createReadStream(realpath);

var acceptEncoding=req.headers['accept-encoding']||'';

var matched=extname.match(/css|js|html/ig);

if(matched&&acceptEncoding.match(/\bgzip\b/)){

console.log(1);

res.writeHead(200,{

'content-type':type,

'Content-Encoding':'gzip'

});

raw.pipe(zlib.createGzip()).pipe(res);

}else if(matched&&acceptEncoding.match(/\bdeflate\b/)){

console.log(2);

res.writeHead(200,{

'content-type':type,

'Content-Encoding':'deflate'

});

raw.pipe(zlib.createDeflate()).pipe(res);

}else{

console.log(3);

res.writeHead(200,{

'content-type':type

});

raw.pipe(res);

}

}

});

});

}

});

  再次访问详细信息页面,查看秒数是否打开。纯静态,路由没变,url没变,维护也很简单。只需更改 bokeDetail.templ.js; 没办法,可能在英雄眼中。这是傻瓜式,只是让你发笑;与此方法类似,现在网站的所有页面都是静态的,并且 SEO 得到充分照顾;

  嗯,其实还有一个很重要的问题:就博客的细节而言,如果博客数量很多,如何批量转移?其实我在编辑和提交博客的时候顺便生成了一个静态页面。为了让详情页快点。. . ; 问题来了,如果我之前有成百上千的博客(当然,我的小前端远没有达到如此丰硕的成果),我一定不能再编辑和提交每个博客;吓死宝宝了,别急,新建一个update.js直接批量生成,非常快!

<p>Artical

.find({}).exec(function(err,docs) {

update(err,docs);

});

function update(err,docs) {

err&&console.log(err);

for(var i=0;i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线