node基础(2)

 

NODE

是一个以webkit(V8)引擎来渲染和解析JS的平台

  • 在没有NODE之前,JS是一门基于客户端浏览器运行的脚本编程语言;JS是前端编程语言;
  • 在有了NODE之后,JS也可以运行在NODE环境中了,我们可以把NODE安装在服务器端,这样我们就可以在服务器端执行JS,JS也可以处理服务器端的业务逻辑了;JS是后台编程语言;

JS是全栈编程语言

JS运行在浏览器中,浏览器提供了很多内置的属性和方法(window全局对象);JS如果运行在NODE环境下,它也提供了很多的属性和方法(global全局对象);

如何在NODE环境下执行JS
  • 在WB的指定JS文件中,通过鼠标右键 Run xxx.js 来运行JS代码(这样是把JS在NODE环境中执行了);这种方式有些时候会出现缓存,尤其是把执行的文件换目录后,缓存出现的几率特别大。
  • 找到当前需要执行的JS所在文件目录,在这个目录中打开DOS窗口,在窗口中输入 node xxx.js 的命令把对应JS执行;
传统后台语言和NODE的对比

传统后台语言:JAVA、PHP、C#、.NET… 
NODE作为后台运行的环境,拿JS编程的优势:

  • 快:基于V8引擎渲染
  • 无阻塞的I/O操作(异步对文件进行增删改查)
  • 基于事件驱动的单线程异步编程

NODE中的模块

node把所有的js按照模块进行划分,分为:

  • 内置模块:node平台天生提供的模块
  • 自定义模块:自己写的模块
  • 第三方模块:别人写的我们调取使用
第三方模块

1、下载安装第三方模块

所有的第三方模块都在npmjs.com上 
在命令窗口中执行 “npm install 模块名” 来安装,把需要使用的第三方模块安装到项目目录下 
npm就是NODE中用来管理模块的命令,npm install 是安装,npm uninstall 是卸载…

2、导入

require 
例如:var less = require(‘less’);

3、使用

less.render()

4、如果我们想把LESS等第三方模块添加到命令行中,我们需要把LESS安装在全局NODE环境下;

npm install less -g 
安装成功后执行 lessc -v ,可以查看到版本号

自定义模块

在NODE环境下,我们创建的每一个JS都可以理解为一个单独的模块,模块和模块之间没有冲突。我们经常需要实现模块和模块之间的相互调用(例如B调取A中的fn方法):

  • 首先在B模块中导入A模块:var A=require(‘./A’); 即使在同一级目录下,我们也需要加./,如果不加的话默认找的是node_modules下的模块,而不是我们自定义的模块
  • 其次还需要在A模块中把供外面使用的方法暴露出来:module.exports={fn:fn};
  • 最后在B模块中就可以通过使用:A.fn() 执行对应的方法了
//A.js
function fn() {
    console.log(1);
}

module.exports = {
    fn: fn
};
//B.js
function fn() {
    console.log(2);
}

var A = require('./A');
A.fn();
 

思考题:创建三个自定义模块,A/B/C,A模块中有一个方法”任意数求和sum”,B模块中有一个方法“求平均数avg”,在B中需要调取A中的sum方法,在C模块中点去B模块中的avg方法,实现获取:98 95 92 96 95 94 92 98 93 90 这十个分数的平均数… 

//A.js
function sum() {
    var total = null;
    arguments.__proto__ = Array.prototype;
    arguments.forEach(function (item, index) {
        item = Number(item);
        !isNaN(item) ? total += item : null;
    });
    return total;
}
module.exports = {
    sum: sum
};
//B.js
var a = require('./A');
function avg() {
    arguments.__proto__ = Array.prototype;
    arguments.sort(function (cur, next) {
        return cur - next;
    });
    arguments.pop();
    arguments.shift();
    //a.sum(arguments) -> a.sum([98,95,96...]) 目标:a.sum(98,95,96...)
    return (a.sum.apply(null, arguments) / arguments.length).toFixed(2);
}
module.exports = {
    avg: avg
};
//C.js
var b = require('./B');
console.log(b.avg(98, 95, 92, 96, 95, 94, 92, 98, 93, 90));
内置模块

node天生提供好的模块,node主要应用于服务器端开发,理解服务器端需要做的事情,我们也就理解node内置模块了。

服务器端需要做的事情

  • 创建服务,监听端口号
  • 接收和解析客户端的请求
  • 在服务器上把客户端需要的内容找到(文件内容的读取)
  • 把找到的内容返回

常用的内置模块:http、url、fs…

1、http 
创建服务、监听端口、接收信息、返回内容…

var server1=http.createServer([callback]); 创建一个服务,这块的回调函数不是在服务创建成功就会执行,而是需要客户端向当前的服务器发送请求,它才会执行(客户端只要发送一个请求,它就会被触发一次执行)。

server1.listen([port],[callback]); 给创建的服务监听端口号(0-65535之间),端口号不能重复,当服务创建成功端口号也监听成功后就会执行对应的回调函数;

启动服务后,服务在不出现意外或者错误的情况下是不会停止的,随时监听客户端的请求,完成我们的响应操作。

2、服务创建成功后如何的向当前服务发送请求

3、url模块

var url=require(‘url’); 
url.parse([string],[boolean]) : 解析一个URL地址,可以把地址中的每一部分分别获取到

  • [string] 要解析的URL地址字符串
  • [boolean] 设定是否把问号传参的值解析为对象,默认是false不解析,写true则为解析

案例:

var url = require('url');
var str = 'http://www.zhufengpeixun.com:80/student/index.html?name=zxt&age=30#haha';
var result = url.parse(str);
console.log(result);

//->结果如下
{
  protocol: 'http:',   //->协议
  slashes: true, //->是否有斜线
  auth: null, //->作者
  host: 'www.zhufengpeixun.com:80', //->域名+端口
  port: '80', //->端口
  hostname: 'www.zhufengpeixun.com', //->域名
  hash: '#haha', //->哈希值
  search: '?name=zxt&age=30', //->问号传参
  query: 'name=zxt&age=30', //->问号传参,不带问号
  pathname: '/student/index.html', //->路径名称
  path: '/student/index.html?name=zxt&age=30', //->路径名称+问号传参
  href: 'http://www.zhufengpeixun.com:80/student/index.html?name=zxt&age=30#haha' //->原始字符串
}
//如果第二个参数设为true的话:
{
  ...
  query: { name: 'zxt', age: '30' },
  pathname: '/student/index.html'
  ...
}
//->query是以对象键值对的方式存储的

4、fs模块 
实现对服务器上的文件进行I/O操作的

var fs=require(‘fs’);

  • fs.readFileSync 同步读取文件中的内容 
    var con=fs.readFileSync(‘./index.html’); 
    第一个参数是读取文件的路径地址 
    第二个参数是读取文件内容的编码格式 
    读取出来的内容是字符串格式的
  • fs.readFile 异步读取文件中的内容 
    fs.readFile(‘./index.html’,function(){ 
    读取成功后触发会发回调函数执行 
    });

除了读取内容以外还可以向文件中写入内容

fs.writeFileSync([pathname],[content],[encode])

  • 第一个参数是路径名称
  • 第二个参数是需要写入的内容(注意只能是字符串或者buffer格式的数据)
  • 第三个参数是编码格式,一般常用’utf-8’
原文地址:https://www.cnblogs.com/yang-xiao-fan/p/7204988.html