GVKun编程网logo

教你如何在Node.js中使用jQuery(node.js jquery)

18

关于教你如何在Node.js中使用jQuery和node.jsjquery的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AMD异步模块定义介绍和Require.js中使用jQuery及j

关于教你如何在Node.js中使用jQuerynode.js jquery的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery、IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf、javascript – 在node.js中使用jQuery、javascript – 如何在Node.js中获取POSTed(jquery)数组数据(使用express)等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

教你如何在Node.js中使用jQuery(node.js jquery)

教你如何在Node.js中使用jQuery(node.js jquery)

想要在NodeJs中使用jQuery?

首先,我们得安装jquery, npm install jquery 。安装后的版本是 3.1.0

接着,第一感觉我们会使用 var $ = require(''jquery'') 。

将以下代码保存为app.js

var $ = require(''jquery'')

$("body").append("<div>TEST</div>");
console.log($("body").html());

运行 node app.js 。提示错误:

Error: jQuery requires a window with a document

那么我们该怎么做呢?

在 npm的jquery安装包首页 ,我们看到可以使用 jsdom 进行模拟一个document。

require("jsdom").env("", function(err, window) {
  if (err) {
    console.error(err);
    return;
  }
  var $ = require("jquery")(window);
  $("body").append("<div>TEST</div>");
  console.log($("body").html());
});

运行,结果OK。

上面的代码,有一个让我不太舒服的地方就是要在回调函数中进行操作。那么我们如何做才可以不在回调函数中进行引入jquery呢?

var $ = require(''jquery'')(require("jsdom").jsdom().defaultView);
$("body").append("<div>TEST</div>");
console.log($("body").html());

一样运行OK。

以上就是本文给大家分享的全部内容了,希望对大家学习node.js能够有所帮助

您可能感兴趣的文章:
  • Jquery通过ajax请求NodeJS返回json数据实例
  • NodeJS使用jQuery选择器操作DOM
  • Nodejs抓取html页面内容(推荐)
  • NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
  • 基于html5和nodejs相结合实现websocket即使通讯
  • Nodejs+express+html5 实现拖拽上传
  • windows系统下简单nodejs安装及环境配置
  • NodeJS学习笔记之FS文件模块
  • nodejs的HTML分析利器node-jquery用法浅析

AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery

AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery

AMD 模块

AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一个可用的模块化 JavaScript 的解决方案。

AMD 模块格式本身是一个关于如何定义模块的提案,在这种定义下模块和依赖项都能够异步地进行加载。它有很多独特的优势,包括天生的异步及高度灵活等特性,这些特性能够解除常见的代码与模块标识间的那种紧密耦合。目前它已经被很多项目所接纳,包括jQuery(1.7)。

RequireJS

RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范。

jQuery 对AMD的支持

jQuery 1.7 开始支持将 jQuery 注册为一个AMD异步模块。有很多兼容的脚本加载器(包括 RequireJS 和 curl)都可以用一个异步模块格式来加载模块,这也就表示不需要太多 hack 就能让一切运行起来。可以看看jQuery 1.7 中的源码:

复制代码 代码如下:

// Expose jQuery as an AMD module, but only for AMD loaders that
// understand the issues with loading multiple versions of jQuery
// in a page that all might call define(). The loader will indicate
// they have special allowances for multiple jQuery versions by
// specifying define.amd.jQuery = true. Register as a named module,
// since jQuery can be concatenated with other files that may use define,
// but not use a proper concatenation script that understands anonymous
// AMD modules. A named AMD is safest and most robust way to register.
// Lowercase jquery is used because AMD module names are derived from
// file names, and jQuery is normally delivered in a lowercase file name.
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
 define( "jquery", [], function () { return jQuery; } );
}

其工作的原理是,所使用的脚本加载器通过指定一个属性,即 define.amd.jQuery 为 true,来标明自己可以支持多个 jQuery 版本。如果有兴趣了解特定的实现细节的话,我们可以将 jQuery 注册为一个具名模块,因为可能会有这样的风险,即它可能被与其它使用了 AMD 的 define() 方法的文件拼合在一起,而没有使用一个合适的、理解匿名 AMD 模块定义的拼合脚本。

高版本的jQuery (1.11.1) 去掉了define.amd.jQuery判断:

复制代码 代码如下:

if ( typeof define === "function" && define.amd ) {
 define( "jquery", [], function() {
  return jQuery;
 });
}

Require.js中使用jQuery

Require.js中使用jQuery非常方便,简单配置就可以了,例如:

复制代码 代码如下:

// 简单的配置
require.config({

    // RequireJS 通过一个相对的路径 baseUrl来加载所有代码。baseUrl通常被设置成data-main属性指定脚本的同级目录。
    baseUrl: "./js",

    // 第三方脚本模块的别名,jquery比libs/jquery-1.11.1.min.js简洁明了;
    paths: {

        "jquery": "libs/jquery-1.11.1.min.js"

    }

});

// 开始使用jQuery 模块
require(["jquery"], function ($) {

    //你的代码
    //这里直接可以使用jquery的方法,比如:$( "#result" ).html( "Hello World!" );

});

Require.js中使用jQuery 插件

虽然jQuery的支持AMD的API, 这并不意味着jQuery插件也是和AMD兼容的。

一般的jQuery 插件格式:

复制代码 代码如下:
(function ($) {
    $.fn.m​​yPlugin = function () {
        //你自己的插件代码
    };
})(jQuery);

不过我们稍微修改一下就可以使用Require.js加载一个jQuery插件:
复制代码 代码如下:

;(function (factory) {
    if (typeof define === "function" && define.amd) {
        // AMD模式
        define([ "jquery" ], factory);
    } else {
        // 全局模式
        factory(jQuery);
    }
}(function ($) {
    $.fn.jqueryPlugin = function () {
        //插件代码
    };
}));

Require.js中使用jQuery UI组件

Require.js中使用jQuery UI组件也类似的,只要改造一下jQuery Widget Factory 代码就可以了,并且感觉jQuery UI的依赖关系加载就可以了。例如:

复制代码 代码如下:

(function (widgetFactory) {

    if (typeof define === "function" && define.amd) {
        // AMD模式
        define("jquery.ui.widget", ["jquery"], function () {

            widgetFactory(window.jQuery);

        });
    } else {
        // 全局模式
        widgetFactory(window.jQuery);
    }
}
(function ($, undefined) {

    // jQuery Widget Factory 代码

}));

IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf

IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf

1、前言

Protobuf是Google开源的一种混合语言数据标准,已被各种互联网项目大量使用。

Protobuf最大的特点是数据格式拥有极高的压缩比,这在移动互联时代是极具价值的(因为移动网络流量到目前为止仍然昂贵的),如果你的APP能比竞品更省流量,无疑这也将成为您产品的亮点之一。

现在,尤其IM、消息推送这类应用中,Protobuf的应用更是非常广泛,基于它的优秀表现,微信和手机QQ这样的主流IM应用也早已在使用它。现在随着WebSocket协议的越来越成熟,浏览器支持的越来越好,Web端的即时通讯应用也逐渐拥有了真正的“实时”能力,相关的技术和应用也是层出不穷,而Protobuf也同样可以用在WebSocket的通信中。

而且目前比较活跃的WebSocket开源方案中,都是用NodeJS实现的,比如:socket.io和sockjs都是如此,因而本文介绍Protobuf在NodeJS上的使用,也恰是时候。

图片

学习交流:

道理我们都懂,然后并没有什么卵用,看完上面这段定义,对于Protobuf是什么我还是一脸懵逼。

图片

4、NodeJS开发者为何要跟Protobuf打交道

作为JavaScript开发者,对我们最友好的数据序列化协议当然是大名鼎鼎的JSON啦!我们本能的会想protobuf是什么鬼?还我JSON!这就要说到protobuf的历史了。Protobuf由Google出品,08年的时候Google把这个项目开源了,官方支持C++,Java,C#,Go和Python五种语言,但是由于其设计得很简单,所以衍生出很多第三方的支持,基本上常用的PHP,C,Actoin Script,Javascript,Perl等多种语言都已有第三方的库。

由于protobuf协议相较于之前流行的XML更加的简洁高效(后面会提到这是为什么),因此许多后台接口都是基于protobuf定制的数据序列化协议。而作为NodeJS开发者,跟C++或JAVA编写的后台服务接口打交道那是家常便饭的事儿,因此我们很有必要掌握protobuf协议。

为什么说使用使用类似protobuf的二进制协议通信更好呢?

但由于web前端的存在,后台同学往往需要特地开发维护一套http接口专供我们使用,如果web也能使用二进制协议,可以节省许多后台开发的成本。在大公司,最重要的就是优化效率、节省成本,因此二进制协议明显优于http这样的文本协议。下面举两个简单的例子,应该有助于我们理解protobuf。

5、选择支持protobuf的NodeJS第三方模块

当前在Github上比较热门的支持protobuf的NodeJS第三方模块有如下3个:

图片

图片

图片

 根据star数和文档完善程度两方面综合考虑,我们决定选择protobuf.js(后面2个的地址:Google protobuf js、protocol-buffers)。

6、使用 Protobuf 和NodeJS开发一个简单的例子

6.1 概述我打算使用 Protobuf 和NodeJS开发一个十分简单的例子程序。该程序由两部分组成:第一部分被称为 Writer,第二部分叫做 Reader。Writer 负责将一些结构化的数据写入一个磁盘文件,Reader 则负责从该磁盘文件中读取结构化数据并打印到屏幕上。准备用于演示的结构化数据是 HelloWorld,它包含两个基本数据:1)ID:为一个整数类型的数据;2)Str:这是一个字符串。6.2 书写.proto文件首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C 语言的数据定义。代码清单 1 显示了例子应用中的 proto 文件内容。清单 1. proto 文件:package lm;message helloworld{   required int32     id = 1;  // ID   required string    str = 2;  // str   optional int32     opt = 3;  //optional field}一个比较好的习惯是认真对待 proto 文件的文件名。比如将命名规则定于如下:packageName.MessageName.proto在上例中,package 名字叫做 lm,定义了一个消息 helloworld,该消息有三个成员,类型为 int32 的 id,另一个为类型为 string 的成员 str。opt 是一个可选的成员,即消息中可以不包含该成员。1、2、3这几个数字是这三个字段的唯一标识符,这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。6.3 编译 .proto 文件我们可以使用protobuf.js提供的命令行工具来编译 .proto 文件。用法:# pbjs <filename> [options] [> outFile]我们来看看options:  --help, -h        Show help  [boolean] 查看帮助  --version, -v     Show version number  [boolean] 查看版本号  --source, -s      Specifies the source format. Valid formats are:                       json       Plain JSON descriptor                       proto      Plain .proto descriptor指定来源文件格式,可以是json或proto文件。  --target, -t      Specifies the target format. Valid formats are:                       amd        Runtime structures as AMD module                       commonjs   Runtime structures as CommonJS module                       js         Runtime structures                       json       Plain JSON descriptor                       proto      Plain .proto descriptor指定生成文件格式,可以是符合amd或者commonjs规范的js文件,或者是单纯的js/json/proto文件。  --using, -u       Specifies an option to apply to the volatile builder                    loading the source, e.g. convertFieldsToCamelCase.  --min, -m         Minifies the output.  [default: false] 压缩生成文件  --path, -p        Adds a directory to the include path.  --legacy, -l      Includes legacy descriptors from google/protobuf/ if                    explicitly referenced.  [default: false]  --quiet, -q       Suppresses any informatory output to stderr.  [default: false]  --use, -i         Specifies an option to apply to the emitted builder                    utilized by your program, e.g. populateAccessors.  --exports, -e     Specifies the namespace to export. Defaults to export                    the root namespace.  --dependency, -d  Library dependency to use when generating classes.                    Defaults to ''protobufjs'' for CommonJS, ''ProtoBuf'' for                    AMD modules and ''dcodeIO.ProtoBuf'' for classes.重点关注- -target就好,由于我们是在Node环境中使用,因此选择生成符合commonjs规范的文件。命令如下:# ./pbjs ../../lm.message.proto  -t commonjs > ../../lm.message.js得到编译后的符合commonjs规范的js文件:module.exports = require("protobufjs").newBuilder({})''import''.build();6.4 编写 Writervar HelloWorld = require(''./lm.helloworld.js'')''lm'';var fs = require(''fs'');// 除了这种传入一个对象的方式, 你也可以使用get/set 函数用来修改和读取结构化数据中的数据成员varhw = newHelloWorld({    ''id'': 101,    ''str'': ''Hello''})varbuffer = hw.encode();fs.writeFile(''./test.log'', buffer.toBuffer(), function(err) {    if(!err) {        console.log(''done!'');    }});6.5 编写Readervar HelloWorld = require(''./lm.helloworld.js'')''lm'';var fs = require(''fs'');var buffer = fs.readFile(''./test.log'', function(err, data) {    if(!err) {        console.log(data); // 来看看Node里的Buffer对象长什么样子。        var message = HelloWorld.decode(data);        console.log(message);    }})6.6 运行结果
图片
由于我们没有在Writer中给可选字段opt字段赋值,因此Reader读出来的opt字段值为null。这个例子本身并无意义,但只要您稍加修改就可以将它变成更加有用的程序。比如将磁盘替换为网络 socket,那么就可以实现基于网络的数据交换任务。而存储和交换正是 Protobuf 最有效的应用领域。

7、使用 Protobuf 和NodeJS实现基于网络数据交换的例子

俗话说得好:“世界上没有什么技术问题是不能用一个helloworld的栗子解释清楚的,如果不行,那就用两个!”在这个栗子中,我们来实现基于网络的数据交换任务。

7.1 编写.protocover.helloworld.proto文件:package cover;message helloworld {    message helloCoverReq {        required string name = 1;    }    message helloCoverRsp {        required int32 retcode = 1;        optional string reply = 2;    }}

7.2 编写client一般情况下,使用 Protobuf 的人们都会先写好 .proto 文件,再用 Protobuf 编译器生成目标语言所需要的源代码文件。将这些生成的代码和应用程序一起编译。可是在某些情况下,人们无法预先知道 .proto 文件,他们需要动态处理一些未知的 .proto 文件。比如一个通用的消息转发中间件,它不可能预知需要处理怎样的消息。这需要动态编译 .proto 文件,并使用其中的 Message。我们这里决定利用protobuf文件可以动态编译的特性,在代码中直接读取proto文件,动态生成我们需要的commonjs模块。client.js:var dgram = require(''dgram'');var ProtoBuf = require("protobufjs");var PORT = 33333;var HOST = ''127.0.0.1'';var builder = ProtoBuf.loadProtoFile("./cover.helloworld.proto"),    Cover = builder.build("cover"),    HelloCoverReq = Cover.helloworld.helloCoverReq;    HelloCoverRsp = Cover.helloworld.helloCoverRsp; var hCReq = newHelloCoverReq({    name: ''R U coverguo?''}) var buffer = hCReq.encode();var socket = dgram.createSocket({    type: ''udp4'',    fd: 8080}, function(err, message) {    if(err) {        console.log(err);    }    console.log(message);});var message = buffer.toBuffer();socket.send(message, 0, message.length, PORT, HOST, function(err, bytes) {    if(err) {        throw err;    }    console.log(''UDP message sent to ''+ HOST +'':''+ PORT);});socket.on("message", function(msg, rinfo) {    console.log("[UDP-CLIENT] Received message: "+ HelloCoverRsp.decode(msg).reply + " from "+ rinfo.address + ":"+ rinfo.port);    console.log(HelloCoverRsp.decode(msg));    socket.close();    //udpSocket = null;});socket.on(''close'', function(){    console.log(''socket closed.'');});socket.on(''error'', function(err){    socket.close();    console.log(''socket err'');    console.log(err);});7.3 书写serverserver.js:var PORT = 33333;var HOST = ''127.0.0.1'';var ProtoBuf = require("protobufjs");var dgram = require(''dgram'');var server = dgram.createSocket(''udp4'');var builder = ProtoBuf.loadProtoFile("./cover.helloworld.proto"),    Cover = builder.build("cover"),    HelloCoverReq = Cover.helloworld.helloCoverReq;    HelloCoverRsp = Cover.helloworld.helloCoverRsp;server.on(''listening'', function() {    var address = server.address();    console.log(''UDP Server listening on ''+ address.address + ":"+ address.port);});server.on(''message'', function(message, remote) {    console.log(remote.address + '':''+ remote.port +'' - ''+ message);    console.log(HelloCoverReq.decode(message) + ''from client!'');    var hCRsp = newHelloCoverRsp({        retcode: 0,        reply: ''Yeah!I\''m handsome cover!''    })     var buffer = hCRsp.encode();    var message = buffer.toBuffer();    server.send(message, 0, message.length, remote.port, remote.address, function(err, bytes) {        if(err) {            throw err;        }        console.log(''UDP message reply to ''+ remote.address +'':''+ remote.port);    })});server.bind(PORT, HOST);

7.4 运行结果
图片

图片
 

8、其他高级特性

8.1 嵌套Messagemessage
Person {  required string name = 1;  required int32 id = 2;        // Unique ID number for this person.  optional string email = 3;  enum PhoneType {    MOBILE = 0;    HOME = 1;    WORK = 2;  }  message PhoneNumber {    required string number = 1;    optional PhoneType type = 2 [default = HOME];  }  repeated PhoneNumber phone = 4; }在 Message Person 中,定义了嵌套消息 PhoneNumber,并用来定义 Person 消息中的 phone 域。这使得人们可以定义更加复杂的数据结构。

8.2 Import Message
在一个 .proto 文件中,还可以用 Import 关键字引入在其他 .proto 文件中定义的消息,这可以称做 Import Message,或者 Dependency Message。比如下例:import common.header; message youMsg{  required common.info_header header = 1;  required string youPrivateData = 2; }其中 ,common.info_header定义在common.header包内。Import Message 的用处主要在于提供了方便的代码管理机制,类似 C 语言中的头文件。您可以将一些公用的 Message 定义在一个 package 中,然后在别的 .proto 文件中引入该 package,进而使用其中的消息定义。Google Protocol Buffer 可以很好地支持嵌套 Message 和引入 Message,从而让定义复杂的数据结构的工作变得非常轻松愉快。

9、总结一下Protobuf

9.1 优点
简单说来 Protobuf 的主要优点就是:简洁,快。

为什么这么说呢?
1)简洁:

因为Protocol Buffer 信息的表示非常紧凑,这意味着消息的体积减少,自然需要更少的资源。比如网络上传输的字节数更少,需要的 IO 更少等,从而提高性能。对于代码清单 1 中的消息,用 Protobuf 序列化后的字节序列为:08 65 12 06 48 65 6C 6C 6F 77而如果用 XML,则类似这样:31 30 31 3C 2F 69 64 3E 3C 6E 61 6D 65 3E 68 65 6C 6C 6F 3C 2F 6E 61 6D 65 3E 3C 2F 68 65 6C 6C 6F 77 6F 72 6C 64 3E一共 55 个字节,这些奇怪的数字需要稍微解释一下,其含义用 ASCII 表示如下:<helloworld>   <id>101</id>   <name>hello</name></helloworld>我相信与XML一样同为文本序列化协议的JSON也不会好到哪里去。

2)快:

首先我们来了解一下 XML 的封解包过程:

这个过程非常复杂,其中将 XML 文件转换为文档对象结构模型的过程通常需要完成词法文法分析等大量消耗 CPU 的复杂计算。反观 Protobuf:它只需要简单地将一个二进制序列,按照指定的格式读取到编程语言对应的结构类型中就可以了。而消息的 decoding 过程也可以通过几个位移操作组成的表达式计算即可完成。速度非常快。

9.2 缺点
作为二进制的序列化协议,它的缺点也显而易见——人眼不可读!

10、参考资料

[1] Protobuf 官方开发者指南(中文译版)
[2] Protobuf官方手册
[3] Why do we use Base64?
[4] The Base16, Base32, and Base64 Data Encodings
[5] Protobuf从入门到精通,一篇就够!
[5] 如何选择即时通讯应用的数据传输格式
[7] 强列建议将Protobuf作为你的即时通讯应用数据传输格式
[8] APP与后台通信数据格式的演进:从文本协议到二进制协议
[9] 面试必考,史上最通俗大小端字节序详解
[10] 移动端IM开发需要面对的技术问题(含通信协议选择)
[11] 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
[12] 理论联系实际:一套典型的IM通信协议设计详解
[13] 58到家实时消息系统的协议设计等技术实践分享
(本文同步发布于:http://www.52im.net/thread-41...)

javascript – 在node.js中使用jQuery

javascript – 在node.js中使用jQuery

我发现你可以在node.js中使用jQuery,但所有的例子都是用于DOM和 HTML操作.

您是否认为将它用于数组迭代(对于每个)等都可以,或者有点矫枉过正?

解决方法

Underscore.js是一个小得多的实用程序库,用于操作对象.

http://documentcloud.github.com/underscore/

npm install underscore

编辑:

但是,node.js对ES5的支持要比浏览器好得多,而且你可能甚至不需要一个库来操作对象.见keeganwatkins的回答.

javascript – 如何在Node.js中获取POSTed(jquery)数组数据(使用express)

javascript – 如何在Node.js中获取POSTed(jquery)数组数据(使用express)

我想将一个数组发布到我的服务器上.但是我很难做到这一点.

我试图发布的数组是一个动态结构化的对象数组,因此我不知道它的长度.

更确切地说,我的阵列是形式的.

var names =[{id:1, name:"nick"},{id:2,name:"bob"},{id:3,name:"john"}.....{id:n, name:"whatever"}]

我使用jquery发布:

$.post("save_names", {
        'names[]': names
    }, function(results) {
        alert(results);
    }); 

我的节点代码如下:(我使用stormpath-express)

app.post('/save_names', config.access_group, function(req, res) {
    console.log("body ", req.body);
});

这样我从console.log获得以下内容

body  { 'names[]': [ '[object Object]', '[object Object]', '[object Object]' ] }

当我尝试打印数组时:console.log(“body”,req.body.names);
我的身体未定义

有人可以解释为什么会这样吗?如何解决我的错误,为什么我不能只发布名称:名称和简单的工作?

解决方法:

您发送的数据不正确.您可以在开发工具中检查请求.你会看到这样的事情:

Form Data
    names[]:[object Object]
    names[]:[object Object]
    names[]:[object Object]
    names[]:[object Object]

尝试自己将数据转换为JSON:

$.post("save_names", {
        'names[]': JSON.stringify(names)
    }, function(results) {
        alert(results);
    });

不要忘记正确访问你的数组:console.log(“body”,req.body [‘names []’]);.

关于教你如何在Node.js中使用jQuerynode.js jquery的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法_jquery、IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf、javascript – 在node.js中使用jQuery、javascript – 如何在Node.js中获取POSTed(jquery)数组数据(使用express)等相关内容,可以在本站寻找。

本文标签: