zoukankan      html  css  js  c++  java
  • 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’
  • 相关阅读:
    Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    分布式架构2:Nginx下Session存储
    分布式架构3:MySQL集群(Mysql Cluster7.5.5)
    分布式架构1:Nginx实现负载均衡
    Oracle 触发器记录
    [Deprecation Notice] 本博客弃用, 迁移至新博客
    KM算法 O(n^3)最大权完美匹配
    Python 学习笔记(附 Pytorch)
    你一定看的懂的:vlan与交换机端口的三种模式access,trunk和hybrid
    Git代码回滚
  • 原文地址:https://www.cnblogs.com/yang-xiao-fan/p/7204988.html
Copyright © 2011-2022 走看看