node-初步-一

53次阅读

共计 2116 个字符,预计需要花费 6 分钟才能阅读完成。

node 介 绍

node.js 的一些 ‘ 是 ’ 与 ‘ 不是 ’

  • 不是一个框架, 库
  • 不是一门新的语言
  • 是一个平台
  • 是一个 JS 的运行环境(浏览器也是 JS 的运行环境)
  • 运行在 Chrome 的 V8 引擎中, 性能很高

    • 并不在浏览器沙箱中运行
    • 功能上类似 C /C++
    • 能访问电脑上的资源(文件, 网络等)

node.js 现阶段应用场景

  • 高性能 web 服务器

    • 单线程异步实现
    • 其他语言 Java / Python / NGINX
  • 前端构建 / 前端工程化(搭环境)

    • 转义(es6 -> es5, less/sass -> css)
    • 压缩, 混淆(把易读的源代码转化成几乎不可读的, 最主要的手段就是通过改变形参的名字)
    • 打包(把从入口文件开始的所有使用到的文件打包成一个文件)
  • 爬虫, 命令行工具等
  • Electron (VScode, Atom)

    • 由于没有 UI 框架, node 和浏览器结合, 利用浏览器窗口实现用户界面(VScode)

背 景

  • 常见的 输入 - 输出 模型

    1. 同步 I /O
      当文件读取 完全结束 时返回内容

      • 传统方式
        一个文件完全读取执行完成后, 再读取下一个

           for(var i = 0; i < 10; i++) {var content = readFile(i + '.txt')
           }
      • 优化方式(C/C++)
        所有文件同时读取, 哪个先读取完, 哪个先执行
        select 函数是系统自带的一个函数, 会在所传入参数数组中的任何一个元素准备好时进行返回

           var conn1 = connect()
           var conn2 = connect()
           var conn3 = connect()
          
           while(true){var readyConns = select([conn1, conn2, conn3])
                   for(var readyConn of readyConns) {var data = read(readyConn)
                        var result = process(data)
                        Write(readyConn, result)
                   }
           }
      • 多线程
        多个文件在多个线程中进行
    2. 异步 I /O(node.js)
      脚本在读写设备的同时继续执行, 并在任务完成时调用回调函数
      实际上是通过多个线程实现的, 只不过多线程相对隐藏, 只能够应用相应接口进行调用

      fs.readFile('a.txt', (err, data) => {})
      console.log(1)
  • 同步 / 异步
    同步模式中含有隐藏的等待 I /O, 适用于直线控制流程序
    异步模式中的等待 I / O 在管控之中, 适用于非直线控制模型

node 版本号相关

  • 每年 4 月和每年 10 月发布一个大的版本号(11.x.x->12.x.x)
  • 奇数版本维护的时间相对较短(在下一个偶数号版本发布后完全停止维护)
  • 在新的偶数号版本发布后, 前一个偶数号版本会成为 LTS(Long Term Service)版本, 并继续维护 1.5 年
  • LTS 版本非常稳定(API 几乎不会发生变化), 并会修复漏洞

node 命令

  • 执行 JS 文件

    $ node hello.js(文件名)
  • 交互式控制台(REPL)

    $ node
    > 1 + 1
    2
    
    > .help // 一些常见帮助信息(break/clear/editor/exit/load/save)
    $
    
  • 命令行参数
    process.argv 可以获取传递给脚本的命令行参数
    showargv.js 中只包含一条 console.log(process.argv) 语句

    $ node showargv.js one --and two
    ["node", "/home/margin/showargv.js", "one", "--and", "two"]
  • 调试

    • 在浏览器中调试

      $ node --inspect-brk hello.js

      运行完命令, 打开 Chrome 的控制台点击 node 图标即可
      brk 使命令暂停在第一行, 可不加

    • 在 VScode 中直接调试
    • ndb

模 块

node 并没有在全局作用域中添加很多功能, 多数功能都是通过调用 require 函数从模块中获取的

从路径为 y 的模块中 require(x)
  1. 如果 x 是一个内置模块
    -> 直接返回内置模块
    -> 结束
  2. 如果 x 以 ’/’ 开头
    -> 将 y 设置为根目录
  3. 如果 x 以 ‘./’ 或 ‘../’ 或 ‘/’ 开头
    -> 加载 y + x 组合的路径
  4. 如果 x 看起来不像一个路径

    • 在当前文件夹的 node-modules 文件夹里查找名为 x 的文件夹

      • 如果此文件夹里有 package.json , 则加载 main 字段所指向的文件
      • 如果没有 package.json , 则直接加载文件夹里的 index 文件
    • 如果在当前文件夹的 node-modules 里找不到名为 x 的文件夹

      • 则在当前文件夹的父级文件夹里查找 node-modules
    • 如果 x 为 xx/yy 则加载 xx 文件夹中的 yy 文件
     chunk1 = require('lodash').chunk  // 加载了整个 lodash , 只把 chunk 读取了出来
     chunk2 = require('lodash/chunk')  // 只加载了 lodash 中的 chunk.js 文件

安装 NPM 模块

$ npm install figlet
$ npm i figlet//install 和 global 可以缩写
$ npm i -g figlet
  • npm install : 把文件下载下来, 装到当前工作目录的 node-modules 文件夹里面
  • npm install –global : 全局安装, 注意全局安装并不是在所有地方都可以 require, 只能在当前文件夹中 require , 这里的指的是一个命令行工具装在全局中

正文完
 0