目前nodejs都有什么框架呢?哪个最好

目前nodejs都有什么框架呢?哪个最好,第1张

对于开发者来最好的15个Node.JS框架

Kiss

Kiss.js使用Django风格的模板。通过项目你可以看到,客户端的coffee scripts脚本在刚开始时会被加载。样式使用Stylus。

Sails

Sails 很容易]创建自定义的,企业级的Node.js应用。它被设计成你熟悉的类似Ruby on Rails的MVC框架,但是又可以满足现代应用的需要: 可扩展的数据驱动接口,面向服务的架构。它特别擅长设计图表,时时表单,或多人游戏,你可以在任何项目中使用。

Total

Total.js是另外一旧助你创建Node.js,Web页面/应用的好框架,同样支持MVC架构。它是一旧使用HTML,JavaScript和CSS创建的现代框架。

Partial

Partial.js又一个 Node.JS框架,开发者使用HTML,CSS和JavaScript可以创建大型的Web站点和应用。功能和架构类似于total.js

Flatiron

Flatiron.js同样也是一旧现代的下一代的web框架,帮助开发者创建惊艳的web应用和功能。

Socket Stream

Socket Stream是被来设计时时响应的单页面程序,基于快速的棋模块化r 特性。

Socket.io

Socket.io是基于node.js的实时框架,支持HTML的WebSocket和跨浏览器的向后监察。

Dozer

Dozer是一款极快r 支持前端应用的系统。它不是一个框架,不是一个工具包。Dozer的设计原则是为前端提供RESTful API的接口支持。

Coke

COKE是一个轻量级的MVC框架。它非常简单,模块化的,非常快。

Express.io

Express.io是一组实时的基于node.js的web开发框架,支持MVC构架创建Web应用。

Opa

Ops是g 个JavaScript的框架-快速的加密的Web开发。

Spine

现代的MVC模式,完全支持现代JavaScrip应用。

Mean

MEAN是一款优化后的全栈javascript node.js框架,将简化和加速你的web应用开发。

Sleek

一步就叫座创建快速的,灵活的,友好的web程序。

Stapes

Stapes.js假设你的流程和风格是未知r 。

kraken

Kraken是一个安全的可扩展的框架,可以帮助你更好组织你的架构。他们的模块都可以独立使用。

Derby

Web webjs将你的服务器端脚本变得更简单,更稳定,可读性晚好。

Geddy.

WINTERSMITH

基于node.js的快速的极小的,多平台支持的站点生成器。

第一步,用node输出一个hello world

    var http=require('http') 

    http.createServer(function(req,res){ 

        var urlPares=url.parse(req.url) 

        var query=querystring.parse(urlPares.query) 

        res.end('hello world') 

    }).listen(80)

大部分的node教程在这里会告诉你,我们很容易的建立的一个服务器。但是在实际使我们通常使用的是express.(f**k,难道Node必须要用express吗?自己实现一个Web应用框架真的很难吗?)其实并不是。

那么既然打算自己写我们首先要知道我们要做哪些事情。 1.路由或者智能路由 2.静态文件输出 3.session/cookie 4.模版渲染 5.数据库处理 6.文件上传

第二步,路由

路由好高大上的名字,它是干啥的?url对应具体方法就是它该做的事情。 那么我们为什么不让url对应xxx文件的xx方法。 例如:/user/login能不能自动对应到user.js的login方法上。实现起来很难么?其实只需要几句代码

   

 var fs = require("fs") 

    module.exports=function(req,res){ 

        var query=req.query 

        var urlPares=req.urlPares 

        var pathname=urlPares.pathname 

        var arr=pathname.split("/") 

        req.arr=arr 

        //start 这段代码处理默认行为。可以先忽略 

        if(arr.length==0||arr.length==1){ 

            arr=["","index","index"] 

        }else if(arr.length==2){ 

            arr.push("index") 

        } 

        if(arr[1]==""){ 

            arr[1]="index" 

        } 

        if(arr[2]==""){ 

            arr[2]="index" 

        } 

        //end 这段代码处理默认行为。可以先忽略 

        if (fs.existsSync(APP_PATH+'/controller/'+arr[1]+'.js')){ 

            var controller=require('./controller/'+arr[1]) 

            if(controller[arr[2]]){ 

                controller[arr[2]](req,res) 

            }else{ 

                res.writeHead(404,{'Content-Type': 'text/plain' }) 

                res.end("你访问的控制器不存在指定方法") 

            } 

        }else{ 

            res.writeHead(404,{'Content-Type': 'text/plain' }) 

            res.end("你访问的路径不存在") 

        } 

    }

通过fs判断文件是否存在。然后去require它就行了。APP_PATH是个全局变量表示程序入口的路径。

第三步,静态文件输出

静态文件输出我们需要一个库MIME

  

  var url = require("url") 

    var fs = require("fs") 

    var mime = require('mime') 

    /** 

     * [[检测是否为静态资源]] 

     * @param   {Object}   req [[Description]] 

     * @param   {[[Type]]} res [[Description]] 

     * @returns {bool} [[Description]] 

     */ 

    module.exports = function (req, res) { 

        //正则表达式检测文件后缀 

        var url_resource_reg = /.*\.(html|htm|gif|jpg|jpeg|bmp|webp|htc|swf|png|ico|txt|js|css)/ 

        if (!url_resource_reg.test(req.url)) { 

            return false 

        } 

        var urlPares = url.parse(req.url) 

        var pathname = urlPares.pathname 

        var fileUrl = APP_PATH + "/static" + pathname 

        if (fs.existsSync(fileUrl)) { 

            var contentType = mime.lookup(fileUrl) 

            res.setHeader('Content-Type', contentType || "text/plain") 

            var fileStream = fs.createReadStream(fileUrl) 

            fileStream.pipe(res) 

            fileStream.on('end', function () { 

                res.end() 

            }) 

            return true 

        } else { 

            return false 

        } 

    } 

第四步,session/cookie

这里稍微有点。但是代码量也不多

    var sessions = {} 

    var sessionKey = 'session_key' 

    var EXPIRES = 30 * 60 * 1000 

    function randString(size) { 

        var result = '' 

        var allChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

        size = size || 1 

        while (size--) { 

            result += allChar.charAt(rand(0, allChar.length - 1)) 

        } 

        return result 

    } 

    var generate = function () { 

        var session = {} 

        session.id = Date.now() + randString(12) 

        session.cookies = { 

            expire: Date.now() + EXPIRES 

        } 

        sessions[session.id] = session 

        return session 

    } 

    var parseCookie= function (cookie) { 

        var cookies = {} 

        if (!cookie) { 

            return cookies 

        } 

        var list = cookie.split("") 

        for (var i = 0 i < list.length i++) { 

            var pair = list[i].split("=") 

            cookies[pair[0].trim()] = pair[1] 

        } 

        return cookies 

    } 

    var serializeCookies = function (cookies) { 

        var arr = [] 

        for (var key in cookies) { 

            arr.push(serialize(key, cookies[key])) 

        } 

        return arr 

    } 

    var serialize = function (name, value, option) { 

        var pairs = [name + '=' + encodeURI(value)] 

        //设置cookie默认共用"/"路径 

        option = option || { 

            path: "/" 

        } 

        if (option.maxAge) pairs.push('Max-Age=' + option.maxAge) 

        if (option.domain) pairs.push('Domain=' + option.domain) 

        if (option.path) pairs.push('Path=' + option.path) 

        if (option.expires) pairs.push('Expires=' + option.expires) 

        if (option.httpOnly) pairs.push('HttpOnly') 

        if (option.secure) pairs.push('Secure') 

        return pairs.join(' ') 

    } 

    module.exports = function (req, res) { 

        req.cookies = parseCookie(req.headers.cookie) 

        var id = req.cookies[sessionKey] 

        if (!id) { 

            req.session = generate() 

        } else { 

            var session = sessions[id] 

            if (session) { 

                if (session.cookies.expire > Date.now()) { 

                    session.cookies.expire = Date.now() + EXPIRES 

                    req.session = session 

                } else { 

                    delete sessions[id] 

                    req.session = generate() 

                } 

            } else { 

                req.session = generate() 

            } 

        } 

        for (var key in sessions) { 

            if (sessions[key].cookies.expire < Date.now()) { 

                delete sessions[key] 

            } 

        } 

        var writeHead = res.writeHead 

        res.writeHead = function () { 

            delete req.cookies[ham_sessionKey] 

            var sessionStr = serialize(ham_sessionKey, req.session.id) 

            res.setHeader('Set-Cookie', serializeCookies(req.cookies).concat(sessionStr)) 

            return writeHead.apply(res, arguments) 

        } 

    }

第五步,模版渲染

这是最简单的。

第六步,数据库处理

这里可以是用一些ORM框架。

第七步,文件上传,post

第八步,就是你把上面的代码组织起来。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/280825.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存