zoukankan      html  css  js  c++  java
  • node学习

    http://www.cnblogs.com/jikey/archive/2012/01/16/2323590.html 

    http://www.cnblogs.com/jikey/archive/2010/12/30/1921530.html \

     http://cnodejs.org/topic/506dff4701d0b80148c4d3ab (入门)

    http://www.cnblogs.com/otlive/archive/2012/03/08/2385825.html 

     http://www.cnblogs.com/withasi/archive/2012/05/10/2490015.html

    ------------------------------------------------------------------

     欢迎加入nodejs技术论坛:www.tnodejs.com

    NodeJs之MyWeb框架开发介绍 
       本框架适合使用NodeJs进行web开发的MVC框架模式,本框架使用了express框架作为nodejs的web开发支撑,使用mysql作为数据库开发源,下面我们就简单的介绍如何利用本框架进行一个简单的web应用开发。当然本框架并非官方,也并非专业设计,希望开发者共同来把本框架设计好,以便我们可以在国内实现一个NodeJs的Web开发框架。 
    • 一、项目文件夹介绍
    项目文件夹主要是根据传统的MVC设计模式,设计出来的框架。[font=&amp]
    主文件夹子文件夹文件说明
    application
    common存放application公用文件
    controller逻辑处理层
    core处理基类文件
    model数据处理层
    本文件夹存放核心的MVC设计
    模式中的M和C,控制应用的整
    体逻辑
    conf配置文件:路由处理、log处理、
               数据结构、数据库链接数据
    log记录系统运行日志
    public
    cssview层的样式
    jsview层的JavaScript

    主要是css文件和JavaScript文件
    node_moduleExpress、jade、mysql、
    socket.io、qs、connect等
    所有的nodejs的模块
    viewsource:资源文件Jade文件html文件
    • 一、  入口文件介绍
    本框架的入口文件为index.js,该入口你可以添加多种全局静态变量,例如你所需要的各个文件夹路径,以及一些模块。 举例如下: 
    复制代码
    1. //========================全局变量定义===============================
    2. global.BASE_DIR = __dirname;
    3. global.APP      = global.BASE_DIR + "/application/";
    4. global.CON      = global.APP + "/controller/";
    5. global.CORE     = global.APP + "/core/";
    6. global.MODEL    = global.APP + "/model/";
    7. global.CONF     = global.BASE_DIR + "/conf/";
    8. global.log      = global.BASE_DIR + "/log/";
    9. global.PUBLIC   = global.BASE_DIR + "/public/";
    10. global.VIEW     = global.BASE_DIR + "/view/";
    11. /**
    12. * modules引入
    13. */
    14. global.express = require('express');
    15. global.sio = require('socket.io');
    16. global.fs=require('fs');
    17. global.path = require('path');
    18. global.url = require('url');
    19. global.parseCookie = require('connect').utils.parseCookie;
    20. global.MemoryStore = require('./node_modules/connect/lib/middleware/session/memory');
    21. global.Session = require('./node_modules/connect/lib/middleware/session/session');
    22. global.sys = require('util');

    代码2-1:index.js    在index.js中你需要将你所有的文件夹路径、模块使用全局变量进行替换,该方法的优势在于,避免用户在编码中引入过长的文件路径,只需要使用简单的变量进行替换。 复制代码
    1. urlResolve = require(CORE + "url_resolve");
    2. urlResolve.getActionInfo();
    代码:2-2:路由处理逻辑[size=font-size:12.0pt,12.0pt] 本代码包含进逻辑处理类,同时应用逻辑处理类中的getActionInfo方法,创建服务器,并且处理url请求逻辑。
    • 三、 路由处理逻辑
    主要有六个方法,其中的getActionInfo是exports,其他方法均为私有方法。 复制代码
    1. exports.getActionInfo = function(){
    2.     systemConfig();
    3.     app.get('/:key', function(req, res){
    4.         callUrlRequest(req, res);
    5.     });
    6.     app.post('/:key', function(req, res){
    7.         callUrlRequest(req, res);
    8.     });
    9.     listenPort();
    10. };
    11. function callUrlRequest(req, res){
    12.     var routerMsg = getUrlConf();
    13.     var key = req.params.key;
    14.     var session = checkSession(req, key);
    15.     if(key == "favicon.ico"){return;};
    16.     if(session == 0){
    17.         res.redirect('/index');
    18.         return;
    19.     }
    20.     console.log("[key:"+ key +"] " + "[class:" + routerMsg[key].cla + "] " + "[controller:" + routerMsg[key].fun +"]");
    21.     require(CON + routerMsg[key].con);
    22.     var controllerObj = eval("new " + routerMsg[key].cla);
    23.     controllerObj.init(req, res);
    24.     controllerObj[routerMsg[key].fun].call();
    25. }
    代码2-3:路由处理getActionInfo SystemConfig是配置express框架的相应数据,配置静态文件夹以及express框架的相应配置数据。之后添加两种url请求方式,分别是get和post方法,由于两种方法请求资源的路由处理都是一样的,因此使用callUrlRequest来处理。 callUrlRequest
    1. 获取路由配置文件信息getUrlConf;
    2. 2、获取当前访问的key值,根据key值得到相应的配置信息,配置文件可以展示如下:[size=font-size:12.0pt,12.0pt]
    复制代码
    1.     "test": {
    2.         "con" : "test",
    3.         "cla" : "test",
    4.         "fun" :"test"
    5.     },
    6.     "favicon.ico" : {
    7.         "con" : "",
    8.         "cla" : "",
    9.         "fun" : ""
    10.     },
    11.     "login" : {
    12.         "con" : "index_controller",
    13.         "cla" : "IndexController",
    14.         "fun" : "loginAct"
    15.     },
    16.     "index" : {
    17.         "con" : "index_controller",
    18.         "cla" : "IndexController",
    19.         "fun" : "loginPageAct"
    20.     },
    21.     "loginS" : {
    22.         "con" : "index_controller",
    23.         "cla" : "IndexController",
    24.         "fun" : "toMainPageAct"
    25.     }
    26. }
    代码2-4:配置文件信息 如果当前key为test那么我们就可以得到相应的controller、class和function。同时因为nodejs服务器每次请求数据的时候都会加入favicon.ico,因此在代码中我们需要将其剔除。对于checkSession就是验证登录信息。 3. 得到controller、class和function,首先require相应的controller,然后使用eval来new相应对象,使用controllerObj[routerMsg[key].fun].call();该方法进行调用。(本部分处理,涉及到一个JavaScript的小技巧,如何对一个字符串进行new,同时调用一个对象的方法,该方法名为字符串变量) 4. 最后就是listenPort();进行监听事件,也是服务器开始启动。这样一个基本的路由处理就完成实现了。
    • 四、 数据层实现
         本系统数据层基类是在core文件夹下的base_model.js,该类主要包含数据库的一般方法,主要含有数据库链接、数据库操作基本方法add、update、deleteItem、query、select等,具体实现方式,就不细讲。      BaseModel为基类,其他对应于相应的表的类都继承来自BaseModel基类      继承方法使用JavaScript的原型继承: 
    复制代码
    1. IndexController.prototype = new BaseController();
    2. global.IndexController = IndexController;
    • 五、 逻辑层实现

         类同于数据层的实现方法,其继承都是来自于基类BaseController,BaseController现只包含三个方法:init、displayHtml、displayJade。
    • 六、 代码规范
         本框架不要求开发者是如何去定义代码规范,但本框架实现的代码规范是如下:          变量命名:私有变量统一使用”_name”,全局变量使用大写”VIEW”,简单变量请使用骆驼峰”myName”          方法命名:所有方法请使用骆驼峰”getUrlRequest”         类命名:统一使用首字母大写骆驼峰”BaseController”         文件命名:统一使用下划线分割,类使用下划线分割base_controller.js         总结:整体上就可以实现一个MVC开发的MyWeb框架,其中的方法以及实现都还是处于稚嫩期,希望有开发者愿意加入,并且能够团队合作开发出我们国内优秀的NodeJs的MVC框架。 本框架开发版权所有,由个人开发实现,转载者必须说明来源www.tnodejs.com,谢谢合作 需要下载代码请转到:http://tnodejs.com/webphp/read.php?tid=21

    ------------------------------------------------------------------

     couchDB学习笔记 司徒正美 2012-08-24 22:28 阅读:569 评论:2  

    require("http").request(options, cb)的一些研究 司徒正美 2012-08-24 08:04 阅读:556 评论:0  
    node.js操作Cookie 司徒正美 2012-08-19 15:19 阅读:1971 评论:2  
    Node.js : exports と module.exports の違い 司徒正美 2012-07-25 22:30 阅读:777 评论:0  
    node.js Domain 時代のエラー処理のコーディングパターン 司徒正美 2012-07-25 21:54 阅读:714 评论:0  
    给 connect 的 static 模块加上url路径前缀 司徒正美 2012-07-14 10:06 阅读:887 评论:0  
    RailwayJS vs TowerJS 司徒正美 2012-07-11 08:52 阅读:844 评论:0  
    node.js 后端框架设计构想 司徒正美 2011-12-13 16:22 阅读:3727 评论:6  
    node.js 跨文件的自定义全局对象 司徒正美 2011-12-03 18:22 阅读:1269 评论:0  
    node.js 判定是否为Buffer 司徒正美 2011-12-03 00:12 阅读:1044 评论:0  
    node.js 热部署 司徒正美 2011-11-29 12:47 阅读:3434 评论:4  
    Ubuntu 安装node.js 司徒正美 2011-11-29 02:00 阅读:1445 评论:0  
    node.js 文件操作 司徒正美 2011-11-28 09:17 阅读:5133 评论:8  
    node.js 动态执行脚本 司徒正美 2011-11-25 18:26 阅读:2916 评论:0  
    node.js 一个简单的页面输出 司徒正美 2011-11-20 13:29 阅读:3466 评论:2  
    日本研究node.js的牛人 司徒正美 2011-09-29 21:21 阅读:2222 评论:3  
    node.js入门 司徒正美 2010-07-15 22:04 阅读:27619 评论:22  

    node.js入门

    由于跑到另一个城市,手头没电脑,dom framework不能如期发布,趁此学习一些新东西。这时期最迫切的需要是寻求一个超轻量的后端来架起我的框架,于是触爪伸向传说中的Server-Side Javascrpt。后端JS最出名无疑是Ryan Dahl的node.js,另一个是aptana IDE提供商搞出的jaxer。

    首先下载node.js,然后解压到E盘,改名为node,然后开始菜单输入cmd,用cd命令切换到nodejs的解压目录:

    第一个例子:hello world。

    在node目录下建立hello.js文件,然后在里面输入:

    //var sys = require("sys");
    var sys = require("util")
    sys.puts("Hello world");

    然后我们在命名台中输入命令node hello.js,就能看到命名台输出结果Hello world。

    第二个例子:hello world2。

    好了,这次我们试从游览器中输出hello world。在node目录下建立http.js,然后输入:

    //var sys = require("sys");
    var sys = require("util")
    var http = require("http");
    http.createServer(function(request, response) {
     //   response.sendHeader(200, {"Content-Type": "text/html"});
        response.writeHeader(200, {"Content-Type": "text/html"});
        response.write("Hello World!");
     //   response.close();
        response.end();
    }).listen(8080);
    sys.puts("Server running at http://localhost:8080/");

    然后我们在命名台中输入命令node http.js,在浏览器输入http://localhost:8080/

    第三个例子:hello world2。

    node.js提供一个Buffer类用于转换不同编码的字符串。目前支持三种类型:'ascii','utf8'与'binary'。详见这里

    var Buffer = require('buffer').Buffer,
    buf = new Buffer(256),
    len = buf.write('\u00bd + \u00bc = \u00be', 0);
    console.log(len + " bytes: " + buf.toString('utf8', 0, len));

    第四个例子:hello world3。

    //synopsis.js
    //synopsis 摘要, 梗概,大纲
    var http = require('http');
     
    http.createServer(function (request, response) {
      response.writeHead(200, {'Content-Type': 'text/plain'});
      response.end('Hello World\n');
    }).listen(8124);
     
    console.log('Server running at http://127.0.0.1:8124/');

    前台地址栏:http://localhost:8124/ 

    ------------------------------------------------------------------- 

    前端开发利器webStorm 3.0配置使用

     

    合适的工具会事半功倍,当然也得把握分寸,要不就成了会得越多干的越多的“苦力者”。
    编辑类软件层出不群,各有所长,各有所短。找到一个合适的还真是难。还好有webstorm的出现,最近又是3.0的新版本发布。为什么这么说呢,她与其它的编辑器有什么不同:
    1. 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑文件右上角是没有那个熟悉的米号的。

    换句话说,所有的操作都直接存储,这样带来的坏处就是,没有以前的米号标识,万一键盘误操作也会被立即存储。

    省去了ctrl + s之后,在结合Firefox的vim,基本不动鼠标就可以看到结果页面了。 

    2. 任何一个编辑器只要文件关闭了就没有历史记录了,但是webstorm有。就是说,只要webstorm不关闭,你的文件随时可以返回到之前的操作,webstorm关闭重启后这些历史记录就没有了。这样的坏处也是显然的,由此带来的内存消耗也必然比较大。
    3. 任何一个编辑器,除了服务器svn之外,没有本地版本,但是webstorm提供一个本地文件修改历史记录。

    4. 与时俱进的眼光。zencoding于2009年出现于it界,在这之后,鲜有工具直接集成到里边。webstorm 2.0之后就集成了。node.js,html5,git,cvs等 就不一一列举了。 

    5. 提供的插件也是比较齐全,安装非常方便。这样带来了另外的问题,以前的eclipse是安装第三方的,webstorm貌似不能安装第三方的插件。

    6. 可以导出当前设置:File -> Export setting 下面就是导入设置。 

     

    其它的使用: 

    1. 主题,参照这里。(所需的文件下载 第4条中setting.rar即可,里边包括文章中提到的颜色配置文件)

    2. 添加VIM插件:
    File -> Settings -> Plugins -> Browse repositories -> 搜索vim,对它单击右键Download and install,然后重启IDE就可以了。
    重启之后,控制台会输出: “8:50:07 IdeaVim: Vim keymap was successfully enabled” 说明vim插件安装成功。另外在aptana2.0里边安装vim插件,真是头痛,所有的文件都支持vim模式,在.html居然不支持,郁闷。

    这样会出现另外一个问题,我如果想用ctrl+c,ctrl+v等一些默认的快捷键,该如何呢?安装VIM之后修改Defualt ,在Main menu -> Edit -> Copy 单击右键 Remove ctrl + Insert 只会剩下一个ctrl + c。这样配置后,可以使用部分默认的快捷键,90%的VIM快捷键。这之后还有个问题需要注意,在webstorm重启之后,又被全局默认为vim快捷键,需要在File -> Setting -> Keymap -> Keymaps 中选择Default copy,要不然,还是全局的VIM快捷键。

    3. 除了webstorm之外,此公司还提供另外一个针对phper的开发工具,phpStorm,主页上说明,phpstorm包括所有webstorm的功能。但是习惯于大括号去方法名在同一行显示,所以还得配置:

    File -> Settings -> code style -> PHP -> Wrapping and Braces -> Braces placement ->

    In method declaration : End of line. 

    4. zencoding由于其提供的快捷键,确实 zencoding快捷键修改:

    File -> Setting -> Live Templates 

    这里边如果你修改一个没有什么特别的,但是如果要添加一个需要在下面需要类型:No applicable contexts yet. Define ,单击Define选择要添加的类型。

    如何合理的修改,参考这里。 

    如果你对我修改后的文件设置感兴趣请点这里下载。 (其中就是从我的webstorm导出的setting.jar文件,包括主题,快捷键,zencoding.css等)

    一次性导入:

    导入:File -> Import settings...
    下载后单独模块配置目录:win7 -> C:\Users\jikey(用户名)\.WebIde10\config

    也可以一次性导出settings : File -> Export sttings... 

    5. 在开发js时发现,需要ctrl + return 才能选候选项,又需要配置:

    File -> Setting -> Editor -> Code Completion -> Preselect the first suggestion:

    'Smart' 改为 Always

    6. 注意的地方是:Webstorm的调试是不支持中文路径中文文件名。

    以下是webstorm的快捷键说明:

    复制代码
    1. ctrl + shift + n: 打开工程中的文件(类似于eclipse中的ctrl+shift+R),目的是打开当前工程下任意目录的文件。
    2. ctrl + j: 输出模板
    3. ctrl + b: 跳到变量申明处
    4. ctrl + alt + T: 围绕包裹代码(包括zencoding的Wrap with Abbreviation)
    5. ctrl + []: 匹配 {}[]
    6. ctrl + F12: 可以显示当前文件的结构 
    7. ctrl + x: 剪切(删除)行,不选中,直接剪切整个行,如果选中部分内容则剪切选中的内容
    8. alt + left/right:标签切换
    9. ctrl + r: 替换
    10. ctrl + shift + up: 行移动
    11. shift + alt + up: 块移动(if(){},while(){}语句块的移动)
    12. ctrl + d: 行复制
    13. ctrl + shift + ]/[: 选中块代码<table>....</table>
    14. ctrl + / : 单行注释
    15. ctrl + shift + / : 块注释
    16. ctrl + shift + i : 如果是css中的class则显示当前class详细信息,如果是js则显示function的详细信息(想象一下,如果在jquery的方法上查看详细信息,就直接可以看到实现代码了),如果是php,那当时还是function的详细信息

     

    17. ctrl + '-/+': 可以折叠项目中的任何代码块,包括htm中的任意nodetype=3的元素,function,或对象直接量等等。它不是选中折叠,而是自动识别折叠。
    18. ctrl + '.': 折叠选中的代码的代码。
    19. shift + esc: 当前激活的任意小窗口最小化,也可以是alt + '数字键',数字在小窗口标题栏上有显示。
    20. alt + '7': 显示当前的函数结构。类似于eclipse中的outline的效果。试验了一下,要比aptana的给力一些,但还是不能完全显示prototype下面的方法名。
    21. 如果是*.html页面,则在文件名下的导航栏某DOM结构上右键,可以全选当前DOM结构。

    22. 项目中添加对jQuery的支持。

    File -> settings -> Javascript Libraries -> Add

    在files中添加路径,在documentations urls中添加文档支持。这里边需要注意一下的是,要添加原始未压缩的代码,*.min.js版的方法是不会被提示。

    添加完成后,右边菜单中还有一 download 按钮,单击之后,他会自动选择最新版的js库进行搜索,然后在弹出的列表中,再单击选择一个后,点击Download and Install之后,才会被下载。这块体验不是太好,没有checkbox,也没有radio,只是选中后整行变暗。 

    如果添加多个版本的jQuery,就可以直观的看到各个版本之间新方法的差别了。

    * 在这项的子菜单中 Usage Scope 右边 Project 第二栏Library下单击,选择新添加的jQuery,使其对整个项目进行覆盖。

    也可以在当前页面右键Use JavaScript Library 中选择最顶的刚添加的jQuery支持。 

     

    当然,并不是添加的越多越好,添加的多之后,在代码提示后会有数毫秒的延迟,需要谨慎选择最新版。 

    23. 自动换行设置: File | Settings | Editor --> Use soft wraps in editor

    复制代码

    以下是jquery1.1在ws中效果,还有底下显示vim启动运行的提示,左侧显示数字标题栏名称。

     

     

    以下vim常用快捷键:

    复制代码
    一. 移动:
        h,j,k,l: 左,下,上,右。
        w: 下一个词的词首。W:下一个单词(不含标点)。
        e:下一个词的词尾。E:不含标点。
        b:上一个词的词首。B:不含标点。
        <>: v 模式选中后进行缩进。
    二. 跳转:
        %: 可以匹配{},"",(),[]之间跳转。
        H、M、L:直接跳转到当前屏幕的顶部、中部、底部。
        #H:跳转到当前屏的第#行。
        #L:跳转到当前屏的倒数第#行。
        zt: 当前编辑行置为屏顶。
        zz: 当前编辑行置为屏中。
        zb: 当前编辑行置为屏底。
        G:直接跳转到文件的底部。
        gg: 跳转到文件首。
        gd: 跳转到光标所在函数和变量的定义。
        ():跳转到当前的行首、行尾。
        {}:向上、向下跳转到最近的空行。
        [{:跳转到目前区块开头。
        ]}:跳转到目前区块结尾。
        0: 跳转到行首。
        $: 跳转到行尾。
        2$: 跳转到下一行的行尾。
        #:跳转到该行的第#个位置。
        #G: 15G,跳转到15行。
        :#:跳转到#行。
    三. 选择:
        1.v: 开启可视模式。 V: 开启逐行可视模式。
        2.^V: 矩形选择。
        3.v3w: 选择三个字符。  
        4.ab:包括括号和()内的区域。
        5.aB:包括括号和{}内的区域。
        6.ib:括号()内的区域。
        7.iB:括号{}内的区域。
        8.aw:标记一个单词。
    四. 编辑:
        1. 新增:
            i: 光标前插入。
            I: 在当前行首插入。
            a: 光标后插入。
            A: 当前行尾插入。
            O: 在当前行之前插入新行。
            o: 在当前行之后插入新行。
        2. 修改 c(change) 为主:
            r: 替换光标所在处的字符。
            R:替换光标所到之处的字符。
            cw: 更改光标所在处的字到字尾处。
            c#w: c3w 修改3个字符。
            C:修改到行尾。
            ci':修改配对标点符号中的文本内容。
            di':删除配对标点符号中的文本内容。
            yi':复制配对标点符号中的文本内容。
            vi':选中配对标点符号中的文本内容。
            s:替换当前一个光标所处字符。
            #S:删除 # 行,并以新文本代替。
        3. 删除 d(delete) 为主:
            D:删除到行尾。
            X: 每按一次,删除光标所在位置的前面一个字符。
            x: 每按一次,删除光标所在位置的后面一个字符。
            #x: 删除光标所在位置后面6个字符。
            d^: 删至行首。
            d$: 删至行尾。
            dd:(剪切)删除光标所在行。        
            dw: 删除一个单词/光标之后的单词剩余部分。
            d4w: 删除4个word。
            #dd: 从光标所在行开始删除#行。
            daB: 删除{}及其内的内容。
            diB: 删除{}中的内容。
            n1,n2 d:将n1,n2行之间的内容删除。
        4. 查找:
            /: 输入关键字,发现不是要找的,直接在按n,向后查找直到找到为止。
            ?: 输入关键字,发现不是要找的,直接在按n,向前查找直到找到为止。
            *: 在当前页向后查找同一字。
            #: 在当前页向前查找同一字。
        5. 复制 y(yank)为主:
            yw: 将光标所在之处到字尾的字符复制到缓冲区中。
            #yw: 复制#个字到缓冲区。
            Y:相当于yy, 复制整行。
            #yy:表示复制从光标所在的该行往下数#行文字。
            p: 粘贴。所有与y相关的操作必用p来结合粘贴。
            ]p:粘贴到合适的缩进处。
            n1,n2 co n3:复制第n1行到第n2行之间的内容到第n3行后面。
        6. 大小写转换:
            gUU: 将当前行的字母改为大写。
            guu: 将当前行的字母改为小写。
            gUw: 将当前光标下的单词改为大写。
            guw: 将当前光标下的单词改为小写。
            a. 整篇大写:
            ggguG
            gg: 光标到文件第一个字符。
            gu: 把选择范围全部小写。
            G: 到文件结束。
            b. 整篇小写:gggUG
        7.  其它:
            J:当前行和下一行合并成一行。
        8.  移动:
            n1,n2 m n3:将n1行到n2行之间的内容移至n3行下。
    复制代码

    这样几番配置认识:

    1. 在javascript方面比aptana更接近于当前的流行开发趋势。

    2. 在html,css上比dreamweaver更大胆,更有洞察力。

    3. 在php上比zendstudio更带有一点英雄主义色彩。

    4. 在java上,此公司提供另外一款工具:IntelliJ IDEA

    可以看出纯英文的界面,多如牛毛的快捷键,不推荐新手使用。太方便就会容易培养惰性,而惰性是开发人员的大敌。

     

    最后感谢火爷,是火爷教会我使用webstorm。火爷一直是走在技术前沿的pyer.

      

  • 相关阅读:
    tensorflow结果可视化-【老鱼学tensorflow】
    tensorflow建造神经网络-【老鱼学tensorflow】
    tensorflow添加层-【老鱼学tensorflow】
    tensorflow激励函数-【老鱼学tensorflow】
    tensorflow 传入值-【老鱼学tensorflow】
    tensorflow变量-【老鱼学tensorflow】
    tensorflow会话控制-【老鱼学tensorflow】
    Android 代码判断是否有网络
    Android Toast 工具类
    Android 菊花加载工具类
  • 原文地址:https://www.cnblogs.com/fx2008/p/2703954.html
Copyright © 2011-2022 走看看