• node基础入门笔记


    node基础

    1. 命令行窗口、CMD窗口、终端、shell

    • windows ——> cmd ——> 回车
    • 常用指令:
      • dir : 列出当前目录下的所有文件
      • cd 目录名 : 进入到指定目录
      • md 目录名 : 创建一个文件夹
      • rd 目录名 : 删除一个文件夹
      • 文件名 : 打开此文件
      • e: : 进入e盘
      • d: : 进入e盘
      • cls : 清屏
    • 目录
      • . : 表示当前目录
      • .. : 表示上一级目录
    • 环境变量(windows系统中变量,打开方式 : 设置 ——> 系统 ——> 关于——> 高级系统设置)
      Path(用户变量)
      C:UsersLENONO.dnxin
      C:UsersLENONOAppDataLocalProgramsPythonPython36Scripts
      C:UsersLENONOAppDataLocalProgramsPythonPython36
      • 当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开。如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止。如果还是没找到则报错,类似于作用域链。
      • 所以我们可以将一些经常需要访问的程序和文件的路径添加Path中,这样我们就可以在任意位置来访问这些文件和程序了。
      • 注意,配置完需重启命令行窗口方可生效。

    2. node简介

    • I/O (Input/Output)指的是对磁盘的读写操作。
    • Node可以在后台来编写服务器。
    • Node.js是一个能够在服务器端运行JavaScript的运行环境。
    • Node可以在后台来编写服务器,传统的服务器都是多线程的,Node的服务器单线程的。

    3. 使用 node 运行 js文件

    • 在命令行通过命令进入文件所在文件夹(也可以在图形界面进入此文件夹,在文件夹路径栏直接输入cmd),输入 node xxx.js 来运行。
    • 在vscode的终端上运行。

    4. 模块化简介

    模块化

    • 如果程序设计的规模达到了一定程度,则必须对其进行模块化。
    • CommonJS 的模块功能可以帮我们解决该问题。

    CommonJS规范

    • CommonJS规范的提出,主要是为了弥补ES5没有模块化标准的缺陷。
    • CommonJS对模块的定义十分简单:
      • 模块引用
      • 模块定义
      • 模块标识

    模块引用

    • 在 node 中,通过 require() 函数来引入外部的模块。require() 可以传递模块标识表示作为参数。
    • 使用 require() 引入模块以后,该函数会返回一个对象,这个对象是引入的模块的 exports 对象。
    var math = require("./math.js");
    

    模块定义

    • 在Node中,一个js文件就是一个模块。
    • 在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块的中的变量和函数在其他模块中无法访问。
    • 我们可以通过 exports 来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为 exports 的属性即可。

    模块标识

    • 我们使用 require() 引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
    • 模块分成两大类
      • 核心模块
        • 由node引擎提供的模块。
        • 核心模块的标识就是模块的名字。
        • 示例:var fs = require("fs")
      • 文件模块
        • 由用户自己创建的模块。
        • 文件模块的标识就是文件的路径(绝对路径,相对路径),相对路径使用./或../开头。

    node中的全局对象

    • 在node中有一个全局对象 global,它的作用和网页中window类似。
      • 在全局中创建的变量都会作为 global 的属性保存。
      • 在全局中创建的函数都会作为 global 的方法保存。

    模块的原理

    //当node在执行模块中的代码时,它会首先在代码的最顶部,添加如下代码
    	function (exports, require, module, __filename, __dirname) {
    //在代码的最底部,添加如下代码
    	}
    
    • 实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参。(该函数由node.js调用)

      • exports
        • 该对象用来将变量或函数暴露到外部,值与 module.exports 的值相等,指向同一个对象。
      • require
        • 函数,用来引入外部的模块。
      • module
        • module代表的是当前模块本身。
        • exports就是module的属性。
        • 既可以使用 exports 导出,也可以使用 module.exports 导出。
      • __filename
        • C:UserslilichaoWebstormProjectsclass07051.node4.module.js
        • 当前模块的完整路径。
      • __dirname
        • C:UserslilichaoWebstormProjectsclass07051.node
        • 当前模块所在文件夹的完整路径。
    • exports 和 module.exports

      • 通过exports只能使用.的方式来向外暴露内部变量。
          exports.xxx = xxx
      
      • 而module.exports既可以通过.的形式,也可以直接赋值。
          module.exports.xxx = xxxx
          module.exports = {}
      
      • 不能使用 exports = {},因为这样 exports 指向的就不是 module.exports 所指向的对象 (实际暴露的是这个对象) 了。

    5. 包 package

    简介

    • CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。
    • CommonJS的包规范由包结构和包描述文件两个部分组成:
      • 包结构 : 用于组织包中的各种文件。
      • 包描述文件 : 描述包的相关信息,以供外部读取分析。
    • 所谓的包就是把你所写的一组模块放到一个文件夹内,加一个 package.json 。

    包结构

    • 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,必须包含这个文件:package.json 描述文件。

    包描述文件

    • 包描述文件用于表达非代码相关的信息,最重要的是包描述文件是 package.json。它是一个JSON格式的文件 package.json,位于包的根目录下,是包的重要组成部分。
    • 注意:在JSON文件不能写注释!

    6. NPM(Node Package Manager)

    • 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
    • node所有下载的模块都会放入 node_modules 文件夹中。
    • node在使用模块名字来引入模块时,它会首先在当前目录的 node_modules 中寻找是否含有该模块,如果有则直接使用。如果没有则去上一级目录的 node_modules 中寻找,如果有则直接使用。如果没有则再去上一级目录寻找,直到找到磁盘的根目录,如果依然没有,则报错。
    • npm 命令:
      • npm init : 安装包之前最好先用此命令创建 package.json
      • npm -v : 查看版本
      • npm : 帮助说明
      • npm search 包名 : 搜索包
      • npm install/i : 下载当前项目所依赖的包
      • npm install/i 包名 : 在当前目录安装包
      • npm install/i 包名 -g : 全局模式安装包(全局安装的包一般都是一些计算机使用的工具)
      • npm remove/r 包名 : 删除一个模块
      • npm install/i 包名 --save : 安装包并将其添加到依赖中 (vscode不用加 --save 自动向依赖添加/删除)

    7.cnpm

    • 镜像服务器。

    8. Buffer(缓冲区)

    • Buffer 的结构和数组很像,操作的方法也和数组类似。
    • 数组中不能存储二进制的文件,而 Buffer 就是专门用来存储二进制数据。
    • 使用 Buffer 不需要引入模块,直接使用即可。(是node中扩充的一个对象)
    • 在 Buffer 中存储的都是二进制数据,但是在显示时都是以16进制的形式显示,但是只要是数字输出在控制台,就是10进制。
    • Buffer 中的一个元素,占用内存的一个字节,Buffer 中每一个元素的范围是从00 - ff 0 - 255。
    • 在 Buffer 中一个汉字占用3个字节。
    • Buffer 的大小一旦确定,则不能修改,Buffer 实际上是对底层内存的直接操作。(原因:再扩充会导致buffer所占用的不是连续的内存空间,不好维护。)
    • var buf = Buffer.alloc(10),buf.length 是 buf 占用内存的大小。
    • new Buffer() 方法都被弃用了。
    • Buffer 方法 :
      • Buffer.from(str) 将一个字符串转换为buffer
      • Buffer.alloc(size) 创建一个指定大小的Buffer
      • Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据(alock会初始化所分配的内存空间,allockUnsafe不会初始化)
      • buf.toString() 将缓冲区中的数据转换为字符串
    • 服务器读取/发送数据之前,数据先存在缓冲区中。简单来说 Buffer 就是一个类似于数组的东西,但是存储的是二进制数据

    9. fs 文件系统(File System)

    • 文件系统简单来说就是通过Node来操作系统中的文件
    • 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载。
        var fs = require("fs")
    

    同步和异步调用

    • fs模块中所有的操作都有两种形式可供选择同步和异步。

    flag

    写入读取文件

    1. 同步文件写入/读取(打开、读写、关闭)
    2. 异步文件写入/读取
    3. 简单文件写入/读取
      • fs.writeFile()
      • fs.writeFileSync()
      • fs.readFile()
      • fs.readFileSync()
    4. 流式文件写入/读取
      • 写入或读取大量数据时,最好的方法之一是使用流。
      • 使用流需要创建 :
        • fs.createWriteStream()
        • fs.createReadStream()
      • 使用了 ws = fs.createWriteStream() ,就可以使用 ws.write() 方法来写入它,写入完成后,在调用 ws.close() 方法来关闭流。
      • 如果要读取一个可读流中的数据,必须要为可读流绑定一个 data 事件, data 事件绑定完毕,它会自动开始读取数据(用on绑定)。
      • pipe() 可以将可读流中的内容,直接输出到可写流中。
      • 可以通过监听流的open和close事件来监听流的打开和关闭(用once监听)。
        • on() : 可以为对象绑定一个事件
        • once() : 可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效
    5. 读取文件时返回 buffer ,因为读的不一定是文本,也有可能是图片视频。

    其余fs方法见文档

    学识浅薄,如有错误,恳请斧正,在下不胜感激。

  • 相关阅读:
    antd pro2.0 使用记录五:设置代理
    antd pro2.0 使用记录四:右侧顶部菜单栏+新建页面
    antd pro2.0 使用记录三:多个接口调用问题
    antd pro2.0 记录二:登录/注册页面逻辑,调用后台
    实用的Portraiture滤镜磨皮教程
    mysql 远程访问权限
    vc6.0运用mysql数据库中的编码所导致的乱码问题(接收和输出的编码必须要一致)
    飞思卡尔imx6开发板Linux下GPIO驱动
    beagleBone black 中QT的移植
    Beaglebone Black从零开始系列教程大汇总!
  • 原文地址:https://www.cnblogs.com/yin-jie/p/14940783.html
Copyright © 2020-2023  润新知