八、(1)Node入门与模块

Node.js入门与模块

NodeJs介绍

什么是NodeJs

  1.NodeJs就是一个可以让JavaScript脱离浏览器还能执行的平台,并且这个平台对JavaScript功能进行了增强。

  2.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

客户端编程语言和服务器编程语言

客户端编程语言是运行在客户端浏览器里面。 例如:html,css, javascript
服务器编程语言是运行在服务器上。 例如:java php .net nodejs

客户端编程语言用来实现浏览器页面特效。例如: 幻灯片,轮播
服务器编程语言用来实现网络支付,数据库操作,调用第三方应用。

NodeJs与JavaScript区别

  • 1. node可以书写后台,可以搭建服务器
  • 2. nodeJS没有 window DOM BOM对象
  • 3. 对JS进行了增强

NodeJs优势

  • 1、前后端语言统一(JavaScript 理想状态);
  • 2、前后端分离(淘宝架构);
  • 3、前端开发工具很多都基于Node,只有会Node,使用起来才能得心应手;
  • 4、社区活跃,上万个成熟模块供我们选择使用;
  • 5、上手快,开发简单;

DOS命令

  • cd 进入指定的文件夹
  • cd 文件夹名 进入指定的目录
  • cd ./ 进入当前目录(省略不写)
  • cd ../ 进入上一级目录
  • cd / 进入根目录
  • dir 显示当前文件夹中的文件和目录列表
  • cls 清除屏幕
  • ctrl+c 中断执行
  • node -v 查看node版本号
  • node *.js 运行文件

 CommonJs规范

  • JavaScript是一个强大面向对象语言,它有很多快速高效的解释器。官方JavaScript标准定义的API是为了构建基于浏览器的应用程序。
  • CommonJS API:不是一个语言,也不是一个平台,它只是一个标准(规范)。 它定义的标准主要是对ECMAScript标准API进行增强。
  • CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。

  简单理解:Commonjs是对ECMAScript的功能补充定义了规范(应新增那些功能),NodeJs是对CommonJs的实现(提供那些新功能)。

NodeJs模块基础

模块化概念

  • 1. node解决了浏览器 变量污染的问题
  • 2. 每一个js都是一个独立的模块,所有变量都是私有变量,要使用需要暴露。 module.exports.变量名=变量名;
  • 3. 接收暴露出来的模块。 require(); // 用来接收暴露的模块
  • 4. 每一个模块都是独立,可复用性更高,减少代码冗余

模块化的优势

  • 1. 彻底解决浏览器 变量污染的问题
  • 2. 模块只管理自己内部,与外部无关

主模块

  • 你调用的模块 就是主模块
  • 在主模块中引入的模块 统称为 依赖模块

模块组成

每一个模块 都包含了5个自由变量
  require 引入模块

3个类型:

  A.文件类型 引入方式 require('./*') 通过require引入的文件 以'./' 或者 '../'打头的文件

  B.系统模块 引入方式 require('fs') node自带的模块 引入方式 require("模块名");

举例: 重命名模块

fs.rename('旧的文件名', '新的文件名', function(err) {
if (err) throw err;
console.log('重命名完成');
});

  C.第三方模块
  var jq = require('jquery');

  npm i 模块名 # 本地安装 安装在项目中会自动生成一个node_modules的文件
  npm i 模块名 -g # 全局安装 安装在c盘中

  • module 模块中的所有属性
  • exports 对模块进行暴露 module.exports.xx=xx; == exports.xx=xx;
  • __filename 当前模块的绝对路径
  • __dirname 当前模块所在的文件夹路径

 

模块特点

  • 1、模块中使用var定义变量都是局部变量。
  • 2、模块定义在函数,也是局部。
  • 3、模块有一个模块对象。包含moduleId(模块名)、exports(导出对象)
  • 4、如果模块中需要暴露方法或属性给外部使用,那么就执行往exports对象上面添加。
  • 5、使用一个模块用require(“moduleId”),该方法返回的是模块对象的exports对象。

NodeJs模块进阶

require函数

  require(moduleId)函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。

.是相对于当前目录,模块文件路径的js后缀可以省略
var foo1 = require('./foo'); //当前目录下面的foo.js文件
var foo2 = require('./foo.js');

被引入的模块分为三种

  • 文件模块
  • 第三方模块
  • 系统模块

注意:

  • 1)引入模块文件有语法错误时会报错
  • 2)引入模块不存在时会报错
  • 3)重复引入模块只执行一次
  • 4)在require函数引入模块时,可以省略扩展名 .js .json .node 不写。

exports导出对象

exports对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。

以下例子中导出了一个公有方法。

exports.hello = function () {
console.log('Hello World!');
};

注意:

  • 1)exports 等同于 module.exports
  • 2)exports是一个对象,可以对它添加属性和方法

module模块对象

module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象(module.exports={})。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。

module.exports = function () {
    console.log('Hello World!');
};

以上代码中,模块默认导出对象被替换为一个函数。

注意:

1)可以直接使用 module.exports 导出属性、方法、类

  • module.exports =变量;
  • module.exports =构造函数;

exports和module.exports的区别

exports仅仅是引用了module.exports. 但是真正暴露的对象为module.exports对象

模块初始化

一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的(exports)导出对象。之后,缓存起来的导出对象被重复利用。

模块导入

NodeJs共两种类型的模块:

  • 1、核心模块(系统模块)
  • 2、文件模块

1. 核心模块

核心模块,是由NodeJs平台提供的模块,也可以称为“系统模块”。导入核心模块的规则:不以..或.和/开始的标识符。

2. 文件模块

以..或.和/开始的标识符,这里都被当做文件模块来处理。var hello = require(“./hello”);
var fs = require(“fs”); //fs模块提供文件相关功能

3. node_modules文件夹

node_modules文件夹在nodejs中是一个特殊的文件夹,通过它的名字就可以看出,该文件夹也是用于存放node模块。如果一个模块不是一个系统模块,也不是一个文件模块,那么就会在node_modules文件夹下进行操作。

console.log(module.paths);//node_modules会查找的目录。

  •  当前文件目录下的node_modules目录。
  •  父目录下的node_modules目录。
  •  父目录的父目录下的node_modules目录。
  •  沿路径向上逐级递归,直到根目录下的node_modules目录。
  •  环境变量配置的全局模块目录中。

4. 模块后缀名

require()在分析标识符的过程中,会出现标识符中不包含文件扩展名的情况。CommonJS模规范也允许在标识符中不包含文件扩展名,这种情况下,Node会按js、json、node的次序补足扩展名,依次尝试。

简单理解:如果模块的后缀名为js、json、node那么可以不写。

1. JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。

组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。

默认包中的入口模块为index.js,也可以在包中新建一个package.json包描述文件,设置main属性值为模块的入口。

package.json
{
main:”./hello.js” //模块的入口
}

Package.json包描述文件

Package.json 属性说明

  • name - 包名。
  • version - 包的版本号。
  • description - 包的描述。
  • homepage - 包的官网 url 。
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。(模块也会依赖其他模块。)
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上(代码仓库 , git,svn版本控制工具)。
  • main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。
  • keywords - 关键字,发布到npm后,供其他人搜索。

创建包描述文件的命令:npm init,帮助我们创建一个package.json

NPM(重点)

 

Npm 安装包

npm 安装 Node.js 模块语法格式如下:

npm install <Module Name>

以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:

npm install express

安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过require('express') 的方式就好,无需指定第三方包路径。

var express = require('express');

全局安装与本地安装

npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如:

npm install express # 本地安装
npm install express -g # 全局安装

1.本地安装

  • 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  • 可以通过 require() 来引入本地安装的包名。

2.全局安装

  • 将安装包放在 /usr/local 下或者你 node 的安装目录。
  • 可以直接在命令行里使用。

Npm 常用命令

  • npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
  • npm install <name>安装nodejs的依赖包
  • npm install <name> -g 将包安装到全局环境中
  • npm install <name> --save 安装的同时,将信息写入package.json中
  • npm remove <name>移除
  • npm update <name>更新
  • npm view <name> versions 查看可用版本
  • <name>是操作的模块名
  • npm install <name>安装nodejs的依赖包

注意:如果全局安装的包不能使用,就必须将全局安装目录加入到环境变量中。
NODE_PATH => C:\Users\admin\AppData\Roaming\npm\node_modules

CNPM

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

使用cnpm:  cnpm install <模块名>

作业

1、什么是主模块?
2、定义一个模块,导出对象为函数。
module.exprots= 函数
3、编写一个模块,然后在主模块中使用。
xxx.js
main.js
require(‘./xxx.js’);
4、模块中定义的变量,是否可以在其他模块中使用? 为什么?

5、回家打开www.npmjs.org 找一个jquery和express 模块安装,通过npm安装后在package.json中有记录。
www.npmjs.org : 第三方模块,众多的开发者编写,上传这个平台。

6. 数组去重

let arrs=[1,3,1,2,4,5,3,1,6];

//es5 去重方法
function curarr(arrs){
    let newarr=[];
    for (let i=0;i<arrs.length;i++){
        //如果不存在就存放到新数组
        if (newarr.indexOf(arrs[i])==-1){
            newarr.push(arrs[i]);
        }
    }
    return newarr;
}
console.log(curarr(arrs));

//es6去重方式
let na=new Set(arrs);
//[...] 可以把类数组转换为真正的数组,也可做数组拼接
console.log([na]);

面试题

1. Node.js有没有了解过?
2. 请简要说明Node.js的模块管理?
3. Exports和module.exports的区别

posted @ 2021-06-09 16:00  全村的希望、  阅读(111)  评论(0编辑  收藏  举报