始发精通nodejs

前言:写这篇文章的由来:

什么是Node.js?

之前就有体验过 WebStrom8.0.3 版本,确实不错。

阿里推出的类似React Native和Native
Script的从前端都mobile的解决方案,主要研究如何将Front
End的开发技术和体验移植到Mobile开发中去。现在看起来阿里想做的方案是一套代码可以在Browser,
Android和IOS三个平台几乎无缝的运行。scope可谓大大的。

环境

Qemu: 2.8.0

开发板:vexpress-ca9

 

  1.前段时间单位有新项目启动,服务端要做的工作不多也不算麻烦,就是处理一些中间层的服务,而且我们团队里面个个都会JavaScript,领导就决定试试服务器端的JavaScript,结果本人有幸被派去研究了几天Node,怀着鸡冻的心情开始了node.js的篇章,这篇文章也就是为这几天研究的总结。

很多初学者并没有真正地理解Node.js到底是什么。nodejs.org网站中的描述也没有多大帮助。

最喜欢的是集成了Terminal 很方便的使用NPM,今天装上发现 Terminal
死活打不上字。什么原因!

原理

目前看来原理方面,官方给了下面的workflow和示意图。

Weex file --------------frontend(source code)
↓ (transform) --------- frontend(build tool)
JS bundle ------------- frontend(bundle code)
↓ (deploy) ------------ server
JS bundle in server --- server
↓ (compile) ----------- client(js-engine)
Virtual DOM tree ------ client(weex-jsframework)
↓ (render) ------------ client(render-engine)
Native view ----------- client(render-engine)

图片 1

TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png

图片 2

TB1_SA4MXXXXXXGaXXXpZ8UVXXX-519-337.png

大概可以理解为weex工具使用类似webpack之类的工具将你的JS代码打包为一个JS
Bundle文件,然后通过一个封装的JS Framework将你的JS
Buddle转化为一个Vitual DOM结构,再交给RenderEngine将CSS,
Event等相关东西attach上去,最终渲染在目标平台上讲页面渲染出来。

概述

 
  前面的博文已经使我们的虚拟开发板具备了访问外网的目的,离物联网越来越近了。要玩物联网,Yeelink不得不说,它提供了云平台,可以将设备的数据上传到云端,也可以联网获得云端的数据,我们可以通过手机客户端或在网页端查看或修改,从而达到用手机客户端跟嵌入式设备通信的目的。

    下面我们实现一个非常简单的功能:
添加一个虚拟开关,通过Yeelink的手机客户端或在网页端可以查看和修改这个开端的状态,而我们的板子会每隔2s联网读取一次这个虚拟开关的状态,最后板子根据开关的状态打印不同的提示。

 

  2.一个JavaScript工程师如果没听过node.js那么我想你是不是错过了什么,每个优秀的前端工程师都有必要去了解后台处理流程,那么如果又能从JavaScript出发,岂不是一件很美妙的事么。

首先要清楚Node不是一个Web服务器,这十分重要。它本身并不能做任何事情。它无法像Apache那样工作。如果你希望它成为一个HTTP服务器,你必须借助它内置库自己编写。Node.js只是计算机上执行代码的另一种方式,它是一个简单的JavaScript
Runtime.

 

体验

正文

一、首先登陆Yeelink官网,手动添加一个device,然后在该device下面再创建一个sensor用来代表虚拟开关。

图片 3

二、为Python添加requests模块

Requests 是用Python语言编写,基于urllib,采用Apache2
Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。

1、下载requests模块

下载地址:  或 requests-2.3.0.tar.gz

解压后:

$ls
HISTORY.rst  NOTICE      requests/           setup.cfg
LICENSE      PKG-INFO    requests.egg-info/  setup.py*
MANIFEST.in  README.rst  requirements.txt    test_requests.py*

其中的requests既可以用于Python2也可以用于Python3,然后将这个requests目录拷贝到对应Python的site-packages下面。

在导入requests模块的时候,会提示找不到zlib模块。

2、重新编译Python,支持zlib

下载zlib:  或 zlib-1.2.11.tar.gz 

  • 编译zlib:

    1 #!/bin/bash
    2
    3 export CC=arm-none-linux-gnueabi-gcc
    4
    5 ../zlib-1.2.11/configure \
    6 –prefix=pwd

 修改Makefile,修改AR和RANLIB如下:

AR=arm-none-linux-gnueabi-ar
RANLIB=arm-none-linux-gnueabi-ranlib

然后执行make && make install,
安装完成之后不要忘了把lib下的so和include下的头文件拷贝到板子上

  • 编译Python3:

    1 #!/bin/bash
    2
    3 ../Python-3.6.0/configure \
    4 –host=arm-none-linux-gnueabi \
    5 –build=armv7 \
    6 –prefix=pwd \
    7 –enable-ipv6 \
    8 –enable-shared \
    9 ac_cv_filedev_ptmx=”yes” \
    10 ac_cv_file
    dev_ptc=”no” \
    11 LDFLAGS=”-L/home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/lib \
    12 -L/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/lib \
    13 -L/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/lib \
    14 -L/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/lib”\
    15 CPPFLAGS=”-I/home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/include \
    16 -I/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/include \
    17 -I/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/include \
    18 -I/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/include”\
    19 LDLAST=”-L/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/lib \
    20 -L/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/lib \
    21 -L/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/lib”
    22
    23 make -j4
    24 make install

安装完成后,也可以直接将lib/python3.6/lib-dynload/zlib.cpython-36m-arm-linux-gnueabi.so拷贝到板子上面的/usr/lib/python3.6/lib-dynload/下面即可,
而不必全部更新

  • 编译Python2:

mk1_conf.sh:

 1 #!/bin/bash
 2 
 3 ../Python-2.7.13/configure --prefix=`pwd` \
 4     --host=arm-none-linux-gnueabi \
 5     --build=x86_64-linux-gnu \
 6     --enable-ipv6 \
 7     --enable-shared \
 8     ac_cv_file__dev_ptmx="yes" \
 9     ac_cv_file__dev_ptc="no" \
10     LDFLAGS="-L/home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/lib \
11     -L/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/lib \
12     -L/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/lib \
13     -L/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/lib"\
14     CPPFLAGS="-I/home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/include \
15     -I/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/include \
16     -I/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/include \
17     -I/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/include"\
18     LDLAST="-L/home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/lib \
19     -L/home/pengdonglin/disk_ext/Third_Part/Termcap/aarch32/lib \
20     -L/home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/lib"\

mk2_make.sh:

 1 #!/bin/bash
 2 
 3 make HOSTPYTHON=../x86_64/python \
 4     HOSTPGEN=../x86_64/Parser/pgen \
 5     BLDSHARED="arm-none-linux-gnueabi-gcc -shared" \
 6     CROSS_COMPILE=arm-none-linux-gnueabi- \
 7     CROSS_COMPILE_TARGET=yes \
 8     HOSTARCH=arm-none-linux-gnueabi \
 9     BUILDARCH=x86_64-linux-gnu \
10     -j4

mk3_install.sh:

1 #!/bin/bash
2 
3 make install HOSTPYTHON=../x86_64/python \
4     BLDSHARED="arm-none-linux-gnueabi-gcc -shared" \
5     CROSS_COMPILE=arm-none-linux-gnueabi- \
6     CROSS_COMPILE_TARGET=yes \
7     prefix=`pwd`

安装完成后,也可以直接将lib/python2.7/lib-dynload/zlib.so拷贝到开发板的/usr/lib/python2.7/lib-dynload/下面,而不用全部更新

  • 然后修改mk_ramdisk.sh:

    1 #!/bin/bash
    2
    3 thiry_part=/home/pengdonglin/disk_ext/Third_Part/
    4 cross_compile=/home/pengdonglin/disk_ext/Cross_Compiler/aarch32/
    5
    6 sudo rm -rf rootfs
    7 sudo rm -rf tmpfs
    8 sudo rm -rf ramdisk
    9 sudo losetup -d /dev/loop0
    10 sudo losetup /dev/loop0 ./fs_vexpress_1G.img
    11 sudo partprobe /dev/loop0
    12
    13 sudo mkdir rootfs
    14 sudo cp ${thiry_part}/Busybox/aarch32/_install/
    rootfs/ -raf
    15
    16 sudo mkdir -p rootfs/proc/
    17 sudo mkdir -p rootfs/sys/
    18 sudo mkdir -p rootfs/tmp/
    19 sudo mkdir -p rootfs/root/
    20 sudo mkdir -p rootfs/var/
    21 sudo mkdir -p rootfs/mnt/
    22
    23 sudo cp etc rootfs/ -arf
    24
    25 sudo cp -arf ${cross_compile}/arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/
    26
    27 #Python3
    28 sudo mkdir -p rootfs/usr
    29 pushd rootfs/usr
    30 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python3/aarch32/bin .
    31 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python3/aarch32/lib .
    32 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python3/aarch32/include .
    33 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python3/aarch32/share .
    34
    35 #Python2
    36 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python2/aarch32/bin .
    37 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python2/aarch32/lib .
    38 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python2/aarch32/include .
    39 sudo cp -raf /home/pengdonglin/disk_ext/Python/Python2/aarch32/share .
    40 popd
    41
    42 #SQlite3
    43 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/bin/ rootfs/bin/
    44 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/include/
    rootfs/include/
    45 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/lib/ rootfs/lib/
    46 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/SQlite3/aarch32/share/
    rootfs/usr/share
    47
    48 #Readline
    49 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/include/ rootfs/include/
    50 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/Readline/aarch32/lib/ rootfs/lib/
    51
    52 #Zlib
    53 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/include/
    rootfs/include/
    54 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/Zlib/aarch32/lib/ rootfs/lib/
    55
    56 #BeautifulSoup4
    57 sudo cp -raf /home/pengdonglin/disk_ext/Python/BeautifulSoup4/beautifulsoup4-4.5.3/bs4 rootfs/usr/lib/python2.7/site-packages
    58 sudo cp -raf /home/pengdonglin/disk_ext/Python/BeautifulSoup4/beautifulsoup4-4.5.3/py3k/bs4 rootfs/usr/lib/python3.6/site-packages
    59
    60 #Requests
    61 sudo cp -raf /home/pengdonglin/disk_ext/Python/Requests/requests-2.3.0/requests rootfs/usr/lib/python2.7/site-packages
    62 sudo cp -raf /home/pengdonglin/disk_ext/Python/Requests/requests-2.3.0/requests rootfs/usr/lib/python3.6/site-packages
    63
    64 #Boa
    65 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/WebServer/Boa/boa-0.94.13/src/boa rootfs/bin
    66 sudo mkdir -p rootfs/usr/lib/boa
    67 sudo cp -raf /home/pengdonglin/disk_ext/Third_Part/WebServer/Boa/boa-0.94.13/src/boa_indexer rootfs/usr/lib/boa
    68 sudo mkdir -p rootfs/var/www/cgi-bin
    69 sudo mkdir -p rootfs/var/log/boa
    70
    71 sudo rm -rf rootfs/lib/
    .a
    72 sudo arm-none-linux-gnueabi-strip rootfs/lib/ rootfs/bin/
    73 sudo arm-none-linux-gnueabi-strip rootfs/usr/lib/boa/
    74 sudo arm-none-linux-gnueabi-strip rootfs/usr/lib/

    75 sudo arm-none-linux-gnueabi-strip rootfs/usr/bin/
    76 sudo arm-none-linux-gnueabi-strip rootfs/bin/

    77
    78 sudo mkdir -p rootfs/dev/
    79 sudo mknod rootfs/dev/tty1 c 4 1
    80 sudo mknod rootfs/dev/tty2 c 4 2
    81 sudo mknod rootfs/dev/tty3 c 4 3
    82 sudo mknod rootfs/dev/tty4 c 4 4
    83 sudo mknod rootfs/dev/console c 5 1
    84 sudo mknod rootfs/dev/null c 1 3
    85
    86 sudo mkdir ./tmpfs/
    87 sudo mount -t ext4 /dev/loop0p1 ./tmpfs/
    88 sudo rm -rf ./tmpfs/
    89 sudo cp -raf rootfs/
    ./tmpfs/
    90
    91 sleep 2
    92 sudo umount ./tmpfs/
    93
    94 sudo losetup -d /dev/loop0

3、测试

 1 [root@vexpress ]# python3
 2 Python 3.6.0 (default, May  6 2017, 00:08:14) 
 3 [GCC 4.8.3 20140320 (prerelease)] on linux
 4 Type "help", "copyright", "credits" or "license" for more information.
 5 >>> import requests
 6 >>> 
 7 [root@vexpress ]# python2
 8 Python 2.7.13 (default, May  6 2017, 00:11:41) 
 9 [GCC 4.8.3 20140320 (prerelease)] on linux2
10 Type "help", "copyright", "credits" or "license" for more information.
11 >>> import requests
12 >>> 

 

三、编写python程序获取开关状态

get_switch.py2:

 1 #!/usr/bin/env python2
 2 
 3 import requests
 4 import time
 5 
 6 apiurl = "http://api.yeelink.net/v1.0/device/7445/sensor/405914/datapoints"
 7 apiheaders = {'U-ApiKey':'3957bd54eaddd2fda1f35841d52776d9'}
 8 
 9 while True:
10     r = requests.get(apiurl, headers=apiheaders)
11     print(r.text)
12     sw = r.json()
13     if sw['value'] == 1:
14         print("Switch On")
15     elif sw['value'] == 0:
16         print("Switch Off")
17     time.sleep(2)

get_switch.py3:

 1 #!/usr/bin/env python3
 2 
 3 import requests
 4 import time
 5 
 6 apiurl = "http://api.yeelink.net/v1.0/device/7445/sensor/405914/datapoints"
 7 apiheaders = {'U-ApiKey':'3957bd54eaddd2fda1f35841d52776d9'}
 8 
 9 while True:
10     r = requests.get(apiurl, headers=apiheaders)
11     print(r.text)
12     sw = r.json()
13     if sw['value'] == 1:
14         print("Switch On")
15     elif sw['value'] == 0:
16         print("Switch Off")
17     time.sleep(2)

 

四、测试

运行测试程序,然后在手机客户端或在网页端修改开关的状态,测试程序会联网获得开关的状态:

图片 4

 

完。

  3.互联网的火热使得JavaScript风光无限,且服务端的JavaScript也并不是什么新技术了,相关的框架也有不少,只是node.js的成功让他爆发式的出现在我们的视线中,让很多前端工程师看到了从前端写到后端的另一种实现希望。注:node.js
是一个允许开发人员使用 JavaScript 语言编写服务器端代码的框架。

安装Node.js

WebStrom9 在win10 环境下 Terminal 不能输入的问题!

运行Weex PlayGround

关于Getting
Starting的指导可以参考官方Github

  4.今年8月曾在某大公司最后一轮(第五轮)的面试被问到Node.js的问题,相对应的回答那是相当之糟糕,结果怎样你们懂的,感觉这个问题是导致没有通过的关键点之一…那家公司是我在读大学的时候就无比向往的公司,现在回想起那次经历和过程,谈不上惋惜,毕竟我真的尽力了

Node.js的安装十分容易。只需在这里下载满足你需要的安装程序即可。

莫非是中文输入法?还是系统win10的问题?

个人体会

我基本花了三天才把这一套东西整个Run起来,整体上觉得有几点感觉不是很满意。

  1. 整个工具链还没有出来,我不知道如何初始化一个完整项目,我指的是初始化一个项目,包含JS的脚手架还有目标平台。无法使用命令行添加平台支持,使用命令行打包和运行应用到原生平台上去。
  2. 从Playgroud这个官方的Demo应用来看,组件还相当不完善,UI在两个平台上看都是IOS风格的,颜色感觉是从Bootstrap那边抄过来的感觉。还有就是所有的触碰操作都没有反馈,感觉是在摸玻璃板。不过整体感觉就是Web页面在手机上的感觉,还体会不到其原生方面相同或者类似的体验。
  • 其实这篇文章更多的也是为了完成自己一个小小的心结…好吧,又扯远了。

已安装好Node.js,下一步做什么?

又是添加语言 又是添加英文输入法~~ 还是不行~~

看法

个人感觉阿里画的scope很大——write once, run
anywhere,还有就是vue现在的生态圈子是相对不如React的,感觉现在基本应该观望,看几个月后的生态如何。毕竟其离React

  5.欢迎各种转载,不过请注明出处,谢谢。

安装结束后,你可以输入一个新命令“node”。使用该“node”命令有两种不同的方法。第一种不带任何参数,将打开一个交互式Shell“>”,你可以在这里执行JavaScript代码。 

图片 5

Node是个啥?

 $ node  
 > console.log('Hello World');  
 Hello World  
 undefined  

 

  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性的拿了些下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段。

图片 6

然后就神奇的可以了!

  1.Node 是一个服务器端 JavaScript
解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅。

上面案例中,我在Shell中键入了“console.log(‘Hello
World’)”,并敲回车。Node便开始执行该代码,并显示刚才记录的信息,同时打印出“undefined”。这是因为每条命令都会返回一个值,而console.log没有任何返回,故输出“undefined”。

  2.Node
的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个物理机的连接代码。处理高并发和异步I/O是Node受到开发人员的关注的原因之一。

Node命令的另一种用法是执行一个JavaScript文件。这是我们平时最常用的方法。

  3.Node 本身运行Google V8
JavaScript引擎,所以速度和性能非常好,看chrome就知道,而且Node对其封装的同时还改进了其处理二进制数据的能力。因此,Node不仅仅简单的使用了V8,还对其进行了优化,使其在各种环境下更加给力。(什么是V8
JavaScript 引擎?请“百度知道”)

hello.js 

  4.第三方的扩展和模块在Node的使用中起到重要的作用。下面也会介绍下载npm,npm就是模块的管理工具,用它安装各种
Node 的软件包(如express,redis等)并发布自己为Node写的软件包 。

console.log('Hello World');

$ node hello.js  
Hello World

安装Node

图片 7

  在这简单说说在window7和linux两种环境下安装Node。安装的时候一定要注意Python的版本,多次因为Python版本的问题安装失败,建议2.6+的版本,低版本会出现Node安装错误,查询Python版本可在终端中输入:pyhton
-v

该案例中,我将“console.log(‘Hello
World’);”命令存入一个文件中,并将该文件作为node命令的参数。Node运行文件中JavaScript代码,并输出“Hello
World”。

1.先介绍linux下的安装吧,Node在Linux环境下的安装和使用都非常方便,建议在Linux下运行Node,^_^…我使用的是Ubuntu11.04

案例一:文件的输入与输出

   a.安装依赖包:50-100kb/s大概每个包一分钟就能下载安装完成

Node.js包含一组强大的库(模块),可以帮助我们做很多事。第一个案例中,我将打开一个Log文件,并对它进行解析。

sudo apt-get install g++ curl libssl-dev apache2-utils 
  sudo apt-get install git-core

example_log.txt

   b.在终端一步步运行一下命令:

1 <b>2013-08-09T13:50:33.166Z A 2  
2 2013-08-09T13:51:33.166Z B 1  
3 2013-08-09T13:52:33.166Z C 6  
4 2013-08-09T13:53:33.166Z B 8  
5 2013-08-09T13:54:33.166Z B 5</b> 
git clone git://github.com/joyent/node.git 
  cd node
  ./configure
  make 
  sudo make install

该Log数据什么意思并不重要,基本可以确定每条信息都包含一条数据、一个字母和一个值。我希望将每个字母后面的值进行累加。

安装顺利的话到这一步Node就算安装成功了,2M的网络用了共计12分钟。

我们要做的第一件事是读出文件的内容。

注:如果不用git下载也可以直接下载源码,不过这样下载安装需要注意Node版本问题。使用git下载安装是最方便的,所以推荐之。

my_parser.js 

2.在Windows下使用Cygwin安装Node,这个方式不太推荐,因为真的需要较长时间和较好的人品。我的系统是
win7旗舰版

 1 // Load the fs (filesystem) module
 2 var fs = require('fs');
 3 
 4 // Read the contents of the file into memory.
 5 fs.readFile('example_log.txt', function (err, logData) {
 6 
 7   // If an error occurred, throwing it will
 8   // display the exception and end our app.
 9   if (err) throw err;
10 
11   // logData is a Buffer, convert to string.
12   var text = logData.toString();
13 });

  Cygwin是一个在windows平台上运行的unix模拟环境,下载地址:。

通过内置的文件(fs)模块,我们可以很容易进行文件的输入/输出操作。fs模块有一个readFile方法,该方法以文件路径、回调函数为参数。该回调函数在完成文件读取后调用。文件数据读取后存储在Buffer类型中,为基本的字节数组。我们可以通过toString()方法将它转化为字符串。

下载好Cygwin后开始安装,步骤:

现在我们对它进行解析。

   a.选择下载的来源 – Install from Internet

my_parser.js 

   b.选择下载安装的根目录

 1 // Load the fs (filesystem) module.
 2 var fs = require('fs');
 3 
 4 // Read the contents of the file into memory.
 5 fs.readFile('example_log.txt', function (err, logData) {
 6 
 7   // If an error occurred, throwing it will
 8   // display the exception and kill our app.
 9   if (err) throw err;
10 
11   // logData is a Buffer, convert to string.
12   var text = logData.toString();
13 
14   var results = {};
15 
16   // Break up the file into lines.
17   var lines = text.split('\n');
18 
19   lines.forEach(function(line) {
20     var parts = line.split(' ');
21     var letter = parts[1];
22     var count = parseInt(parts[2]);
23 
24     if(!results[letter]) {
25       results[letter] = 0;
26     }
27 
28     results[letter] += parseInt(count);
29   });
30 
31   console.log(results);
32   // { A: 2, B: 14, C: 6 }
33 });

   c.选择下载文件所存放的目录

现在,当你将该文件作为node命令的参数时,执行该命令将打印出如下结果,执行完毕后退出。

   d.选择连接的方式

$ node my_parser.js  
{ A: 2, B: 14, C: 6 } 

   e.选择下载的网站 –

图片 8

   f.麻烦就麻烦在这步,考验人品的时候到了。需要的下载安装时间不确定,反正需要比较长的时间(超过20分钟),偶尔会出现安装失败的情况。单击一下各个程序包前面的旋转箭头图标选择你想要的版本,选中时会出现了”x”号表示已经选中了该程序包。选择需要下载的程序包:

我大部时候将Node.js作为脚本使用,正如上面所展示的那样。它更易于使用,是脚本程序有力的替代者。

  Devel包:

异步回调

    gcc-g++: C++ compiler
    gcc-mingw-g++: Mingw32 support headers and libraries for GCC
C++
    gcc4-g++: G++ subpackage
    git: Fast Version Control System – core files
    make: The GNU version of the ‘make’ utility
    openssl-devel: The OpenSSL development environment
    pkg-config: A utility used to retrieve information about
installed libraries
    zlib-devel: The zlib compression/decompression library
(development)

正如在上例中看到的那样,Node.js典型的模式是使用异步回调。基本上,你告诉Node.js要做的事,它执行完后便会调用你的函数(回调函数)。这是因为Node是单线程的。在你等待回调函数执行过程中,Node可继续执行其他事务,不必被阻塞直到该请求完毕。

  Editor包:vim: Vi IMproved – enhanced vi editor

这对于Web服务器尤其重要。在现代Web应用访问数据库的过程中特别普遍。当你等待数据库返回结果的过程中,Node可以处理更多请求。与每次连接仅处理一个线程相比,它使你以很小的开销来处理成千上万个并行连接。

  Python包:把Default切换成install状态即可

案例二:HTTP服务器

  Web包:

Node内建有一个模块,利用它可以很容易创建基本的HTTP服务器。请看下面案例。

    wget: Utility to retrieve files from the WWW via HTTP and FTP
    curl: Multi-protocol file transfer command-line tool

my_web_server.js 

  上个截图,以下载zlib-devel为例:

1 var http = require('http');
2 http.createServer(function (req, res) {
3   res.writeHead(200, {'Content-Type': 'text/plain'});
4   res.end('Hello World\n');
5 }).listen(8080);
6 
7 console.log('Server running on port 8080.');

图片 9

在上面,我说是的基本HTTP服务器。该例中所创建的并不是一个功能全面的HTTP服务器,它并不能处理任何HTML文件、图片。事实上,无论你请求什么,它都将返回“Hello
World”。你运行该代码,并在浏览器中输入“ 

  其上几步走完才算把环境搭建完成,可是现在还没有到安装Node,还需要在Cywgin的ASH模式下执行rebaseall,步骤如下:

$ node my_web_server.js  

   a. cmd命令行

现在你可能已经注意到一些不一样的东西。你的Node.js应用并没有退出。这是因为你创建了一个服务器,你的Node.js应用将继续运行,并响应请求,直到你关闭它。

   b. 进入cygwin安装目录下的bin子目录

如果你希望它成为一个全功能的Web服务器,你必须检查所收到的请求,读取合适的文件,并返回所请求的内容。值得高兴的是,有人已经帮你做了这个艰难的工作。

   c. 运行ash进入shell模式

案例三:Express框架

   d. ./rebaseall -v

Express为一个框架,可使创建网站的过程十分简单。你首先需要安装它。除了node命令,你还需要访问“npm”命令。利用该工具,你可以访问社区所创建的庞大模块集。其中之一就是Express。 

   e. 没有错误就关闭命令行窗口

1 $ cd /my/app/location  
2 $ npm install express  

  好了,现在到下载安装Node了,启动Cygwin.exe后输入:

当你安装了一个模块,它将出现在应用程序所在目录的“node_modules”文件夹中。现在我们可以利用Express来创建一个基本的静态文件服务器。

  $ wget
  $ tar xf node-v0.4.12.tar.gz
  $ cd node-v0.4.12
  $ ./configure
  $ make
  $ make install

my_static_file_server.js

  3.直接下载node.exe文件

1 <b>var express = require('express'),
2     app = express();
3 
4 app.use(express.static(__dirname + '/public'));
5 
6 app.listen(8080);</b>

$ node my_static_file_server.js

  nodejs.org下载较慢所以我在网盘上传了一个,下载地址:

现在你已创建了一个强大的静态文件服务器。你可以通过浏览器请求访问你放在public文件夹中任何文件,并进行展示,包括HTML、图片等任何东西。比如,把一个名为“my_image.png”的图片放在public文件夹中,你可以在浏览器中输入“

  听说有不太稳定的问题,不过你假如只是想先在windows下了解Node,个人感觉这个方法比你装个Cygwin好很多。

NPM

  注:原本不太想写安装Node这段,可是为了这篇文章的全面性还是写了,没想到一写就是那么长一段了…茶几了

上面我们已经接触到了npm,但我仍想强调一下在Node.js开发过程中该工具的重要性。它有成千上万个模块可帮我们解决遇到的大部分典型问题。在重新发明轮子之前,记得检查一下npm中是否有相应功能。 

“Hello World” – 为什么每次见到这句心情都会小激动,不解…

上一例中,我们手动安装了Express。如果你的程序包含很多“依赖”(Dependency),那再利用该方法安装它们就不合适了。为此npm提供了一个package.json文件。

  首先,创建个hello.js的文件,在文件中copy如下代码:

package.json 

  var http = require('http');
  http.createServer(function (req, res) {
   res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
  }).listen(1337, "127.0.0.1");
  console.log('Server running at http://127.0.0.1:1337/');
<b>{
  "name" : "MyStaticServer",
  "version" : "0.0.1",
  "dependencies" : {
    "express" : "3.3.x"
  }
}</b>

代码逻辑:

package.json文件包含了应用程序的基本信息。其中“dependencies”部分描述了你想安装模块的名称和版本。该案例,接受Express
3.3的任何版本。你可以在该部分列出你想要的所有依赖。

   a. 全局方法require()是用来导入模块的,一般直接把 require()
方法的返回值赋值给一个变量,在 JavaScript 代码中直接使用此变量即可
。require(“http”) 就是加载系统预置的 http 模块

代替之前一个个安装每个依赖,现在我们可以运行一个命令,即可将它们全部安装完成。

   b. http.createServer 是模块的方法,目的就是创建并返回一个新的web
server对象,并且给服务绑定一个回调,用以处理请求。

$ npm install

   c. 通过 http.listen() 方法就可以让该 HTTP 服务器在特定端口监听。

运行该命令,npm将在当下文件夹中查找“package.json”文件。一旦找到,即可安装所列出的所有依赖。

   d.
console.log就不用多说了,了解firebug的都应该知道,Node实现了这个方法。

代码的组织

    注: 想了解具体细节请查看文档
cnodejs.org/cman/all.html#http.createServer

在大部分应用程序中,你的代码往往被分割到几个文件中。现在让我们把最开始案例中的Log分析脚本分离出来。这样该程序将更易于测试与维护。

  接着运行Node服务器,执行hello.js代码,成功启动会看见console.log()中的文本。有图有真相:

parser.js 

图片 10

// Parser constructor.
var Parser = function() {

};

// Parses the specified text.
Parser.prototype.parse = function(text) {

  var results = {};

  // Break up the file into lines.
  var lines = text.split('\n');

  lines.forEach(function(line) {
    var parts = line.split(' ');
    var letter = parts[1];
    var count = parseInt(parts[2]);

    if(!results[letter]) {
      results[letter] = 0;
    }

    results[letter] += parseInt(count);
  });

  return results;
};

// Export the Parser constructor from this module.
module.exports = Parser;

  图片 11

在此创建了一个新文件,来存放Log分析脚本。这仅仅是一种标准JavaScript,还有很多方法可用来封装该代码。我选择重新定义一个JavaScript对象,这样更容易进行单元测试。

npm的下载和使用

该程序中最重要的部分是“module.exports =
Parser;”这一行代码。它告诉Node从该文件中要输出的内容。在该例中,我输出了构造函数,用户可以用Parser对象来创建实例。你可以输出任何你想要的。

  除Node本身提供的API外,现在有不少第三方模块可极大的提高开发效率,npm就是Node的软件包管理器,可以用它安装所需软件包并发布自己为nodejs写的软件包。官网地址:npmjs.org

现在我们看一下,如何导入该文件,来使用Parser对象。

  安装只需要在终端写入一行代码:    

my_parser.js 

复制代码 代码如下:

 1 // Require my new parser.js file.
 2 var Parser = require('./parser');
 3 
 4 // Load the fs (filesystem) module.
 5 var fs = require('fs');
 6 
 7 // Read the contents of the file into memory.
 8 fs.readFile('example_log.txt', function (err, logData) {
 9 
10   // If an error occurred, throwing it will
11   // display the exception and kill our app.
12   if (err) throw err;
13 
14   // logData is a Buffer, convert to string.
15   var text = logData.toString();
16 
17   // Create an instance of the Parser object.
18   var parser = new Parser();
19 
20   // Call the parse function.
21   console.log(parser.parse(text));
22   // { A: 2, B: 14, C: 6 }
23 });

curl | sh

如模块一样,文件被引入其中,你需要输入路径,而非名称。

  npm安装node扩展包同样是一行代码:  

总结

复制代码 代码如下:

希望该教程可以帮助到你。Node.js是一个强大、灵活的技术,可以帮助解决各种各样的问题。它已经超出了我们的想像

npm install <包名>    

原文链接:

//例:npm install express

  注:如果安装模块的过程中报域名错误的话,请清空缓存
>npm cache clean 或重启计算机即可。

理解Node的模块概念

  在Node中,不同的功能组件被划分成不同的模块。应用可以根据自己的需要来选择使用合适的模块。每个模块都会暴露一些公共的方法或属性。模块的使用者直接使用这些方法或属性即可,对于内部的实现细节就可以不用了解。除了Node本身提供的API外,开发人员也可以利用这个机制来将应用拆分成多个模块,以提高代码的可复用性。

  1.如何使用模块?

  在Node中使用模块是非常方便的,在 JavaScript
代码中可以直接使用全局函数 require() 来加载一个模块。

  在刚刚”Hello World”的例子中,require(“http”) 可以加载系统预置的 http
模块;模块名称以 “./” 开始的,如 require(“./myModule.js”) 用来加载与当前
JavaScript 文件同一目录下的 myModule.js 模块。

  2.自己如何开发模块?

  刚刚介绍使用require()导入模块的时候,模块名称以 “./”
开始的这种,就是自己开发的模块文件。需要注意的就是JS文件的系统路径。

  代码中封装了模块的内部处理逻辑,一个模块一般都会暴露一些公开的方法或属性给其他的人使用。模块的内部代码需要把这些方法或属性给暴露出来。

  3.来一套简单的例子。先创建一个模块文件如myModule.js,就一行代码

  console.log(‘Hi Darren.’)
  然后创建一个test.js文件,导入这个JS文件,执行node看到结果

图片 12

  现在Node社区中已有不少第三方的模块,希望能有更多人通过学习Node,加入到这个大家庭中,为Node社区来添砖加瓦。先谢谢之,咱们继续。  

  4.来一个深点的例子。这个例子中将会针对 私有和共有
进行介绍。先创建一个myModule.js,代码如下:

var name = "Darren";
  this.location = "Beijing";
  this.showLog = function(){
   console.log('Hi Darren.')
  };

  代码中出现了三种类型,分别是:
私用属性,共有属性和共有方法,再创建一个test.js,执行Node

图片 13

  结果高亮的地方很清楚的告诉我们,私有方法我们在模块以外是取不到的,所以是undefined。共有属性和共有方法的声明需要在前面加上
this 关键字。

Node能做什么和它的优势

  Node核心思想:  1.非阻塞;  2.单线程;  3.事件驱动。

  在目前的web应用中,客户端和服务器端之间有些交互可以认为是基于事件的,那么AJAX就是页面及时响应的关键。每次发送一个请求时(不管请求的数据多么小),都会在网络里走一个来回。服务器必须针对这个请求作出响应,通常是开辟一个新的进程。那么越多用户访问这个页面,所发起的请求个数就会越来越多,就会出现内存溢出、逻辑交错带来的冲突、网络瘫痪、系统崩溃这些问题。

  Node的目标是提供一种构建可伸缩的网络应用的方案,在hello
world例子中,服务器可以同时处理很多客户端连接。

  Node和操作系统有一种约定,如果创建了新的链接,操作系统就将通知Node,然后进入休眠。如果有人创建了新的链接,那么它(Node)执行一个回调,每一个链接只占用了非常小的(内存)堆栈开销。   

  举一个简单的异步调用的例子,把test.js和myMydule.js准备好了,^_^。把以下代码拷贝到test.js中并执行:

  var fs = require('fs');
  fs.readFile('./myModule.js', function (err, data) {
    if (err) throw err;
    console.log('successfully');
  });
  console.log('async');

图片 14

  所谓的异步,大家应该都能想得到运行时会先打先显示”async”,再显示”successfully”。

  Node是无阻塞的,新请求到达服务器时,不需要为这个请求单独作什么事情。Node仅仅是在那里等待请求的发生,有请求就处理请求。

  Node更擅长处理体积小的请求以及基于事件的I/O。

  Node不仅仅是做一个Web服务的框架,它可以做更多,比如它可以做Socket服务,可以做比方说基于文件的,然后基于像一些比方说可以有子进程,然后内部的,它是一个很完整的事件机制,包括一些异步非注射的解决方案,而不仅仅局限在网络一层。同时它可能,即使作为一个Web服务来说,它也提供了更多可以深入这个服务内核、核心的一些功能,比方说Node使用的Http
Agent,这块就是它可以更深入这个服务内核来去做一些功能。

Node事件流概念

  因为Node
采用的是事件驱动的模式,其中的很多模块都会产生各种不同的事件,可由模块来添加事件处理方法,所有能够产生事件的对象都是事件模块中的
EventEmitter 类的实例。代码是全世界通用的语言,所以我们还是用代码说话:

var events = require("events"); 
  var emitter = new events.EventEmitter(); 
  emitter.on("myEvent", function(msg) { 
    console.log(msg); 
  }); 
  emitter.emit("myEvent", "Hello World.");

简单的分析这段:

   1. 使用require()方法添加了events模块并把返回值赋给了一个变量

   2. new
events.EventEmitter()这句创建了一个事件触发器,也就是所谓的事件模块中的
EventEmitter 类的实例

   3. on(event, listener)用来为某个事件 event 添加事件处理方法监听器

   4. emit(event, [arg1], [arg2], […])
方法用来产生事件。以提供的参数作为监听器函数的参数,顺序执行监听器列表中的每个监听器函数。

  EventEmitter 类中的方法都与事件的产生和处理相关:

   1. addListener(event, listener) 和 on(event, listener)
这两个方法都是将一个监听器添加到指定事件的监听器数组的末尾

   2. once(event, listener)
这个方法为事件为添加一次性的监听器。该监听器在事件第一次触发时执行,过后将被移除

   3. removeListener(event, listener)
该方法用来将监听器从指定事件的监听器数组中移除出去

   4. emit(event, [arg1], [arg2], […]) 刚刚提到过了。

  在Node中,存在各式各样不同的数据流,Stream(流)是一个由不同对象实现的抽象接口。例如请求HTTP服务器的request是一个流,类似于stdout(标准输出);包括文件系统、HTTP
请求和响应、以及 TCP/UDP
连接等。流可以是可读的,可写的,或者既可读又可写。所有流都是EventEmitter的实例,因此可以产生各种不同的事件。

  可读流主要会产生以下事件:

data   当读取到流中的数据时,此事件被触发
end   当流中没有数据可读时,此事件被触发
error   当读取数据出现错误时,此事件被触发
close  
当流被关闭时,,此事件被触发,可是并不是所有流都会触发这个事件。(例如,一个连接进入的HTTP
request流就不会触发’close’事件。)

  还有一种比较特殊的 fd
事件,当在流中接收到一个文件描述符时触发此事件。只有UNIX流支持这个功能,其他类型的流均不会触发此事件。

  相关详细文档:_

强大的File System 文件系统模块

  Node 中的 fs
模块用来对本地文件系统进行操作。文件的I/O是由标准POSIX函数封装而成。需要使用require(‘fs’)访问这个模块。所有的方法都提供了异步和同步两种方式。

  fs
模块中提供的方法可以用来执行基本的文件操作,包括读、写、重命名、创建和删除目录以及获取文件元数据等。每个操作文件的方法都有同步和异步两个版本。

  异步操作的版本都会使用一个回调方法作为最后一个参数。当操作完成的时候,该回调方法会被调用。而回调方法的第一个参数总是保留为操作时可能出现的异常。如果操作正确成功,则第一个参数的值是
null 或 undefined 。

  同步操作的版本的方法名称则是在对应的异步方法之后加上一个 Sync
作为后缀。比如异步的 rename() 方法的同步版本是 renameSync()
。下面列出来了 fs 模块中的一些常用方法,都只介绍异步操作的版本。

  test.js和myModule.js文件准备好了木?把下面这段代码copy到test.js中执行一次

  var fs = require('fs');
  fs.unlink('./myModule.js', function (err) {
    if (err) throw err;
    console.log('successfully deleted myModule.js');
  });

  如果没有报error,那么myModule.js就被删除了,就是这么简单

  图片 15

  这只是一个简单的例子,感兴趣的话自己去多多尝试,实践出真理。由于篇幅原因就不多举例了。^_^

学习Node的总结:

1.对于一个linux的命令和shell知识几乎为零的我来说,这段时间又学到了不少关于linux知识;vim真是一个强大的编辑器,不用鼠标的感觉真的很好;而且有一点对我来说很重要,在linux下编程很cool,尤其是在团队中都是使用windows的,装装更健康^_^。

2.理解了服务端JavaScript的一个成功框架-Node,以及它的一些优势和使用的方式,这篇文章就是最好的总结,当然,这只会是一个开始。

3.对于没有进入那么梦想的公司其实是有那么点遗憾,不过生活就应该要这样,有波折有起伏,这正是我需要并且期待的…那么新的生活还是要继续,做自己的舵手,把握好自己的方向,过去的就让它过去吧。

一些想对大伙说的话:

1.
在这我得打击一部分人的积极性。假如你对后台技术不够了解或者没接触过服务端语言,不知道I/O这些知识,没有后台处理流程这种概念,那么……Node并不是一门适合入门的服务端技术。为什么这么说:

   a.重点就是中文实例少,文章少,想系统的学习会比较麻烦,所以在使用过程中总有一种不成熟的感觉,当然主要还是因为我对它不熟悉所造成的。国内使用Node的公司确实不多,当然国外还是有不少了,从cnodejs.org截了一个图:

    图片 16

   b.对没有经验的朋友来说node其实并不好上手,从最简单“Hello

world”就可以看出来(各种运行环境和安装细节的了解都得费点功夫),不要以jQuery库为比较,所处理的事物不同,学习的成本也不同

所以不太建议作为新手入门的服务端技术,如果想学习一门服务端语言PHP和Python都是不错的选择,因为:书多
例子多 框架多 上手简单 容易理解 搭建方便…

   c.以上都是我个人善意的建议,由于水平有限,请大家多多指教,希望嘴下留情。

2.
关于Node的书写规范和具体技巧本人就不献丑了,自己写Node的代码也不多,不过面向对象的编程思想在哪都是好使的。

以上内容是小编给大家介绍的nodejs初步体验篇,希望大家喜欢。

您可能感兴趣的文章:

  • nodejs开发环境配置与使用
  • 详谈nodejs异步编程
  • nodejs实现的一个简单聊天室功能分享
  • 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
  • nodejs中操作mysql数据库示例
  • NodeJS制作爬虫全过程
  • nodejs中实现路由功能
  • Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
  • Nodejs学习笔记之Global
    Objects全局对象
  • Nodejs学习笔记之NET模块
  • NodeJS学习笔记之MongoDB模块
  • NodeJs基本语法和类型
  • NodeJS使用jQuery选择器操作DOM
  • Nodejs关于gzip/deflate压缩详解
  • nodejs实现遍历文件夹并统计文件大小
  • iPhone手机上搭建nodejs服务器步骤方法

相关文章