尚硅谷-Node.js基础入门
一杯茶的时间,上手Node.js

node安装资料

node -v 检测安装的版本
cnpm淘宝镜像安装

  • window环境
    https://www.jianshu.com/p/985...

    npm install -g cnpm --registry=https://registry.npm.taobao.org
  • mac 前要加sudo 用管理员权限安装

    sudo npm install -g cnpm --registry=https://registry.npm.taobao.org   

       
    npm、cnpm 安装node包的规则,以安装webpack包为例

    cnpm init  //初始化 项目 创建package.json 文件
    package.json
        dependencies(依赖项)
        devDependencies(开发依赖项)
        script ( npm run buid 运行的脚本 )
    cnpm install webpack  //安装模块到项目目录下,不会将模块依赖写入pakage.json
    cnpm install --global webpack  //--global(-g) 表示全局安装,通常用于安装脚手架等工具
    cnpm install --save webpack    //-–save(-s) 表示本地安装,会被加至dependencies(生产依赖项)部分
    cnpm insall --save-dev webpack //-–save-dev 表示本地安装,会被加至devDependencies(开发依赖项)部分
    cnpm install --save webpack@4.0.0  //安装特定版本的webpack,只需要在其后加 ‘@版本号’
    cnpm install webpack webpack-cli -D //同时安装两个 包 并且按安装到devDependencies(开发依赖项)中
    npm install 参数
        安装模块到项目目录下  \n不会将模块依赖写入pakage.json
            npm install moduleName
        将模块安装到全局,\n具体安装到磁盘哪个位置,\n要看 npm config prefix 的位置
            npm install -g moduleName
            npm install modulesName -g
        是将模块安装到项目目录下,\n并在package文件的dependencies\n节点写入依赖。生产依赖
            npm install moduleName -S
             npm install -save moduleName
            npm install moduleName --save
        将模块安装到项目目录下,\n并在package文件的devDependencies\n节点写入依赖。开发依赖
            npm i moduleName -D
            npm install moduleName -D
            npm install --save-dev moduleName
            npm install moduleName --save-dev
                会安装到 生产依赖中,最好不用
    npm uninstall moduleName -D  //卸载依赖  怎么装就怎么卸载,install变为uninstall即可
    如何运行 node包
        npx 命令运行包(5.0 之后添加的命令)
        npm run build 命令运行包
            在package.js中配置运行脚本
            scripr:{"build":webpack --config myconfig.js}
            然后就可以直接在命令行中输入 npm run build 运行webpack 了
    进程和线程
        进程
            进程负责为程序运行提供必要的环境
            进程就相当于工厂中的车间
        线程
            线程是计算机中最小的计算单位,线程负责执行进程中的程序
            线程就相当于工厂中的工人
        单线程
            js是单线程的
        多线程
            java\pythono都是多线程语言
    视频教程
    精彩文章
        一杯茶的时间、上手Node.js
    一杯茶的时间,上手 Node.js
    
  • Node可以在后台编写服务

    • 进程
      进程负责为程序运行提供必要的环境
      进程就相当于工厂中的车间
    • 线程
      线程是计算机中最小的计算单位,线程负责执行进程中的程序
      线程就相当于工厂中的工人
    • 单线程
      js是单线程
    • 多线程
      Java/Python都是多线程语言
  • 传统的服务器都是多线程的
    每进来一个请求,就创建一个线程去处理请求
  • Node服务器是单线程的
    Node处理请求时是单线程,但是在后台拥有一个I/O线程池
  • 特征
    异步、事件驱动、非阻塞IO

    模块化

  • 在node中,一个js文件就是一个模块
  • 在node中每一个js代码都是独立运行在一个函数中
    而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
    不要总是往全局中写东西,会污染全局作用域,污染全局命名空间,这种模块化的方式可以避免污染全局命名空间
  • CommonJs对模块的定义十分简单

    • 模块的引用 reuqire()
    • 模块的定义 创建一个js文件 export添加属性或方法进行输出
    • 模块的标识

    01.helloNode.j

    //引入其他模块
    /*
      1、在node中,通过require()函数引入外部模块
      2、require()可以传递一个文件的路径作为参数,
         node将会自动根据该路径来引入外部模块
         这里的路劲,如果是相对路劲,必须以./ 或者 ../开头
      3、使用require()引入一个模块以后,该函数会返回一个对象,
         这个对象代表的是引入的模块
      4、我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过标识来找到指定的模块
         -没看分为两大类
             核心模块
               -由node引擎提供的模块
                   // var fs = require('fs');  console.log(fs)  //文件模块 不用写路劲直接写名字就行
                   // var path = require('path');  //路劲模块
                   // var http = require('http');  //服务模块
               -核心模块的标识就是模块的名字
             文件模块
               - 由用户自己创建的模块
               - 文件模块的标识就是文件的路径(绝对路径,相对路径)
                   相对路径使用 ./ 或者 ../ 开头
    */
    var md = require("./02.module.js");
    console.log(md)

    02.module.js

    console.log('我是一个模块,我是02.module.js');

/*

我们可以通过exports来向外部暴露暴露变量和方法
    只需要将需要暴露给外部的变量或方法设置为exports的属性即可

*/
//向外部暴露属性或者方法
export.x = "我是02.module.js中得x";
export.y = "我是02.module.js中得y";

#包package
1. 包结构
   – package.json:描述文件,必须
   – bin:可执行二进制文件  这里边的文件都是可以直接在系统中运行的   //一般不会有这个文件,除非是一些工具 webpack
   – lib:依赖的其他js代码,library(图书馆,库),非必须
   – doc:文档,非必须
   – test:单元测试,非必须
2. 包规范
#npm

1. npm -v:查看npm版本
2. npm version:查看所有模块的版本
3. npm seaarch math:搜索math包
4. npm init:初始化package.json
5. npm install math(npm i math):安装math包,安装包的时候是根据package.json来识别的,没有该文件的话不能识别这是一个包,就会全局安装
6. npm remove math(npm r math):删除math包
7. npm i math --save(npm i math -S):安装到生成依赖
8. npm install:自动根据package.json中的依赖下载所有的包
9. npm install math -g:全局安装包(全局安装的包一般都是一些工具)

* 通过npm下载的包都放到node_modules文件夹中
     我们通过下载的包,直接通过包名引入即可  // var express = require('express')
* node在使用模块名字引入模块时,他会首先在当前目录的node_modules中寻找是否含有该模块
     如果有则直接使用,如果没有则去上一层的node_modules中寻找
     如果有则直接使用,如果没有则在去上一层寻找,直到找到为止
     直到磁盘根目录中,如果依然没有找到,则报错

index.js  入口文件

var math = require('math');
console.log(math); //查看math包的所有方法


#cnpm
淘宝镜像 https://developer.aliyun.com/mirror/NPM?from=tnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

#Buffer(缓冲区)
文档地址 http://nodejs.cn/api/buffer.html
视频地址 https://www.bilibili.com/video/BV1bs411E7pD?p=13


* 中间传送数据的容器 用来缓存二进制数据
   node作为服务器,接受到的数据是二进制的所以要存到buffer中,给用户发送数据也是二进制,先存到buffer中然后在发送


1. Buffer的结构和数组很像,操作的方法也和数组类似,
   * js的原生数组性能相对来说比较差,这也是js被其他语言诟病的一个原因
2. 数组中不能存储:图片、MP3、视频(等这类二进制文件),而Buffer就是专门用来存储二进制数据的,而且性能比数组要好
   * 他的元素为16进制的两位数
   * 一个元素就表示内存中的一个字节。
   * 实际上Buffer中的内存不是通过JavaScript分配的,而是在底层通过c++申请的
   * 也就是我们可以直接通过Buffer来创建内存中的空间
3. Buffer是node中的一个核心对象,使用Buffer不需要引入模块,直接使用即可
4. 在Buffer中存储的都是二进制数据、(计算机中所有的二进制数据在显示时都是以16进制显示的)
   * 数据最终呀发生给客户端,数据在传输过程中都是以二进制传输的
   * Buffer中每一个元素的范围是从  00 - ff(16进制)  0-255(10进制)  00000000-11111111(2进制八个0到八个1)
        计算机中一个0或者一个1 我们称为1位(bit)
        8bit = 1byte(字节)
        1024kb = 1kb
        1024kb = 1mb
        1024mb = 1gb
        1024gb = 1tb
        字节是数据传输的最小单位
        
        buffer中的一个元素,占用内存中的一个字节
5. Buffer一但确定大小,则不能改变,Buffer实际上是对底层内存的直接操作,一但创建就在内存中开辟了一个固定大小的空间,如果增大的话,就需要开辟新的空间,内存地址就不连续了。性能极其不好,所有一但确定大小就不能改变
创建一个  buffer.js 文件 并运行下列代码

//将一个字符串保存到buffer中
var str = "Hello Buffer"; //一个英文1个字节
var str = "Hello 尚硅谷"; //一个汉字3个字节 3个汉字9个字节,在内存中总共占用15个字节
var buf = Buffer.from(str);

//console.log(buf);  //Buffer实际上就是做了一件事把str转化成二进制数据来保存
//console.log(buf.length);  //占用内存的大小
//console.log(buf.length);  //字符串的长度

//创建一个10个字节长度的buffer
//var buf2 = new Buffer(10); //buffer构造函数都是不推荐使用的

var buf2 = Buffer.alloc(10);

//通过索引来操作buf
buf2[0] = 88;
buf2[1] = 255;
buf2[2] = 0xaa; //设置16进制的aa前边要加0x
buf2[15] = 255;//buf2长度为10,一但创建不能改变大小,所以设置也没用
buf[3] = 556;  //566 转化成二进制是   
               //1000101100 超过8位,只会保留后8位 
               //  00101100 (16进制是2c)

//console.log(buf2);
//console.log(buf2[2]); //输出170(0xaa对应的10进制) 只要数字在控制台输出一定是10进制
//只要是数字永远输出的都是10进制。转换成字符串,并传递16就可以输出对应的16进制了
//console.log(bug2[2].toString(16));  

//for(var i =0;i<buf2.length;i++){
//    console.log(buf[i]);  //输出的全部转化为10进制
//}

//只分配空间不会将原有的数据清0,可能会含有敏感数据,但是性能会更好
var buf3 = Buffer.allocUnsafe(10);
console.log(buf3); //<Buffer 18 1e 4a 00 00 00 00 00 00 00>

var buf4 = Buffer.from("我是一段文本数据");
console.log(buf4.toString());//使用toString方法才能将字符串重新打印出来

旧城以西
47 声望1 粉丝

« 上一篇
webpack
下一篇 »
Js原型、Promise