Node.js基础——模块

2023-11-13

在Vscode上使用node.js运行js代码

法一:终端运行

打开终端
在这里插入图片描述
在终端输入:node 文件路径\文件名
在这里插入图片描述

法二:右键Run Code

在这里插入图片描述
即可运行代码,得到结果:
在这里插入图片描述

Vsode设置node代码提示

打开vscode终端命令:

  1. 安装typings
npm install -g typings
  1. 安装nodejs的代码提示依赖
npm install @types/node

安装完成时候,输入代码就会有提示符了:
在这里插入图片描述

CommonJS规范(模块化规范)

JS标准的缺陷

  • JS是没有模块化系统(ES5)
    模块化:就是将一个大的代码分成若干个小的代码,没有模块化的代码都是不可复用的。
    JS有模块化,即一个js文件就可以看作是一个模块,但是如果模块2依赖于模块1那么必须先引入模块1,否则就会报错,所以说JS有模块但是没有模块化系统。
  • 标准库较少
    如jQuery就不是标准库,是由程序员自主开发的
  • 没有标准的接口
  • 缺乏管理系统

没有模块化系统带来的影响

  • 依赖关系
    如果按两个js文件之间有依赖关系,必须保证引入的顺序。
  • 命名空间的问题:
    当我们引入多个js文件,不同的js文件可能会有相同的变量名字,那么后引入的就会覆盖先引入的。
  • 代码组织
    在js中不能直接定义内部变量,不能起到保护作用。
    即两个js文件可以通过html直接访问对方文件的变量(需要以html做中介,在浏览器端输出):
    a.js:
function a (){
   console.log("我是a中的函数")
}

b.js:

b = 100
a()

text.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <script type='text/javascript' src='./a.js'></script>
    <script type='text/javascript' src='b.js'></script>
    <script type='text/javascript'>
    </script>
</body>
</html>

浏览器输出:
在这里插入图片描述

但是,两个js文件之间不通过html直接运行是不可以直接访问的。
(都没有引入对方怎么可能看得见)
在这里插入图片描述

CommonJS的模块化规范

CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷。
CommonJS规范对模块的定义十分简单∶

  • 模块定义:在Node中一个js文件就是一个模块
  • 模块引用:在Node中通过require()函数来引入外部的模块。
    引入之后才可以使用另一个js文件中的内容。
  • 模块标识:就是可以唯一表示一个模块的东西
    使用require()引入外部模块时,使用的路径就是模块标识

注意: commonJS只是一个规范,没有具体实现。由node进行实现:node根据规范编写相应的js代码。

node模块使用_CommomJS规范

Node实现了CommomJS规范的规范
默认情况一个js文件(即一个模块)里面的方法或者属性,外面是没法访问的。
如果要让外部可以访问模块里面的方法或者属性,就必须在模块里面通过exports或者module.exports暴露属性或者方法。
同时在另一个文件中使用require引入一个方法。

一个js文件里面的方法或者属性不可见的原因

在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块的中使用var定义的的变量和函数在其他模块中无法访问。

(这里强调的是使用var,因为在JS中如果不使用var声明的变量就是全局变量,也就不受模块作用域的限制了;
但是声明成全局变量没有意义我们一般不这样用,想要设置成私有变量就用var,想要设置成全局变量就使用export进行暴露即可)

eg:hello.js:

console.log('hello world')
var x = 100
var y = 200

即hello.js:的代码我们可以看成是这样的:

(function (){
    console.log('hello world')
    var x = 100
    var y = 200
})()

所以无法直接访问另一个文件中访问var变量。

exports属性

需要将全局可见的变量暴露出去可以通过exports来进行设置:
只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
eg:
暴露属性:

exports.x = 100
exports.y = 200

暴露方法:

exports.fn = function (){
    console.log('我是一个函数')
}

module.exports属性

需要将变量暴露出去也可以通过 module.exports来进行设置:
module.exports可以通过设置成属性,即.的形式暴露变量:
module.exports.XXX=XXX
也可以通过module.exports = {}暴露变量:

module.exports = {
    a,
    b,
    upper
}

require方法

require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
如果使用相对路径,必须以.或..开头
eg:

require('./hello.js')

接收require返回值

  • require返回值
    使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块。
    所以我们设置变量接受这个对象,就可以接收引入模块传过来的变量了。
var md = require('./hello.js')

然后就可以通过 md.变量名 访问另一个文件向外暴露的对象

使用require引入例子

注意使用如果变量不使用exports声明,是无法将变量引入来的。

hello.js:

console.log('hello world')
exports.x = 100
exports.y = 200
exports.fn = function (){
    console.log('我是一个函数')
}

01.js:

var md = require('./hello.js')
console.log(md)
console.log(md.x)

输出:
在这里插入图片描述

路径的两种表示方式

模块分为核心模块和文件模块

  • 核心模块:由node引擎提供的模块
    核心模块的表示就是模块的名字,所以引入的时候直接写名字就可以了。
    eg:
var fs = require("fs")
  • 文件模块:由用户自己创建的模块
    文件模块的表示就是文件的路径(绝对路径,相对路径),引入的时候就将文件的位置写上。

注意: 如果引入的js文件有要执行的内容(如:调用了一个函数),使用require引入该文件的时候,就会执行对应的内容。

global

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

eg:

var a = 10
b = 100
console.log(global.a)
console.log(global.b)

输出:

undefined
100

js文件是运行在函数中的——验证

之前我们说一个js文件是运行在一个函数中的,我们来验证一下

  • 函数中才会有arguments参数
    在js文件按中输出arguments:
console.log(arguments)

输出:

[Arguments] {
  '0': { x: 100, y: 200, fn: [Function (anonymous)] },
  '1': [Function: require] {
    resolve: [Function: resolve] { paths: [Function: paths] },
    main: Module {
      id: '.',
      path: 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js',
      exports: [Object],
      parent: null,
      filename: 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js\\hello.js',
      loaded: false,
      children: [],
      paths: [Array]
    },
    extensions: [Object: null prototype] {
      '.js': [Function (anonymous)],
      '.json': [Function (anonymous)],
      '.node': [Function (anonymous)]
    },
    cache: [Object: null prototype] {
      'c:\\Users\\86198\\VScode\\qianDuan\\Node.js\\hello.js': [Module]
    }
  },
  '2': Module {
    id: '.',
    path: 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js',
    exports: { x: 100, y: 200, fn: [Function (anonymous)] },
    parent: null,
    filename: 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js\\hello.js',
    loaded: false,
    children: [],
    paths: [
      'c:\\Users\\86198\\VScode\\qianDuan\\Node.js\\node_modules',
      'c:\\Users\\86198\\VScode\\qianDuan\\node_modules',
      'c:\\Users\\86198\\VScode\\node_modules',
      'c:\\Users\\86198\\node_modules',
      'c:\\Users\\node_modules',
      'c:\\node_modules'
    ]
  },
  '3': 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js\\hello.js',
  '4': 'c:\\Users\\86198\\VScode\\qianDuan\\Node.js'
}
  • agruments.callee属性保存的是当前执行的函数对象,可以进行输出查看

验证:

console.log(arguments.callee)

输出:

[Function (anonymous)]

验证:

console.log(arguments.callee+"")
// 拼串会调用toString方法,显示函数结构

输出:

function (exports, require, module, __filename, __dirname) {
console.log(arguments.callee + "")
// 拼串会调用toString方法,显示函数结构
}

结论:在node执行模块的时候,它会将我们写的内容嵌套在如下函数中:

function (exports, require, module, __filename, __dirname) {
     自己写的代码内容
}

我们直接使用的exports, require变量也是通过这个函数传过来的
参数解析:
- exports:该对象用来将变量或函数暴露到外部
- require:函数,用来引入外部的模块
- module:module代表的是当的模块本身,exports就是module的属性

console.log(module.exports == exports)

结果:True
- __filename:表示的是当前模块(js文件)的完整路径
- __dirname:表示的是当前模块所在文件夹的完整路径
eg:

console.log(__filename)
console.log(__dirname)

输出:

c:\Users\86198\VScode\qianDuan\Node.js\01module.js
c:\Users\86198\VScode\qianDuan\Node.js

exports和module.exports的区别

两者着本质上是一个对象,但是:

  • 通过exports只能使用.的方式来向外暴露内部变量
    exports.XXX=XXX
  • module.exports既可以通过.的形式,也可以直接赋值
    module.exports.XXX=XXX
    module.exports = {}

代码演示

示例一: 都可以使用.的方式来向外暴露内部变量
hello.js:

exports.name1 = '孙悟空'
module.exports.name2 = '猪八戒'

01.js:

var hello = require('./hello')
console.log(hello.name1)
console.log(hello.name2)

输出:

孙悟空
猪八戒

示例二: module.exports可以通过直接赋值暴露对象,而exports不可以
当给module.exports赋值的时候可以访问到:
hello.js

module.exports = {
    name2:'猪八戒'
} 

01.js:

var hello = require('./hello')
console.log(hello.name2)

输出:

猪八戒

当给exports赋值的时候可以不访问到:
hello.js

exports = {
    name2:'猪八戒'
} 

01.js

var hello = require('./hello')
console.log(hello.name2)

输出:

undefined

原理

原因其实很简单,变量指向的问题,实际上对外暴露是 module.exports 起的作用,而exports是因为指向它才具有暴露对象的能力。
如果给module.exports赋值,就是在里面定义向外暴露的对象;
而给exports赋值,exports就不指向module.exports,就无法定义向外暴露的对象了。

node模块的分类

node模块分成三类:node内置模块、自己写的模块、第三方模块
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js基础——模块 的相关文章

随机推荐

  • typora插件_Typora+zotero搞定Markdown随写随引

    使用工具及简要安装 Typora 超级好用的免费Markdown编辑器 在尝试了多款Markdown软件之后 我选择了它 下载链接 Typora官网 https www typora io Zotero 文献管理软件 插件Better Bi
  • char与signed char, unsigned char的区别

    一 开始 今天有一个困扰的问题 就是char与signed char unsigned char这三者的区别 二 三者之间 1 ANSI C 提供了3种字符类型 分别是char signed char unsigned char 而不是像s
  • matlab中的mod和rem的异同

    rem和mod是求余的 但是算法不同 差异在哪呢 就在于分别使用了fix和floor 函数fix和floor都是圆整用的 fix是向0的方向圆整 如fix 1 5 1 fix 1 5 1 而floor是向下圆整 如floor 1 5 2 f
  • Maven下Junit的使用

    创建Maven项目 在pom xml中添加引用包Junit
  • 示波器的原理和使用

    1 示波器简介 示波器是一种用来测量交流电或脉冲电流波的形状的仪器 由电子管放大器 扫描振荡器 阴极射线管等组成 除观测电流的波形外 还可以测定频率 电压强度等 凡可以变为电效应的周期性物理过程都可以用示波器进行观测 2 示波器的分类 模拟
  • 前端html后端java_前端html向后端java传递数据的几种方式(暂时使用到)

    注 data 类型可按照具体场景 具体定义 不仅仅只有下面的传递方式 1 删除 前段传递方式为dataType JSON type DELETE 前段 ajax url interfaces deleteAccessRule id type
  • win10 Face_recognition教程

    文章目录 1 pip加速下载 更改pip镜像源 2 face recognition配置 1 安装dlib 2 安装face recognition modules 3 安装face recognition 4 人脸识别开源项目集锦 htt
  • HashMap的使用

    put方法 Hashmap的put方法放值 可以单次向HashMap中添加一个键值对 没有顺序 HashMap
  • 微信小程序开发笔记一

    微信小程序开发笔记 一 微信小程序的结构 1 初识小程序 2 快捷键 3 查阅文档 二 常用组件 1 input组件 2 button组件 三 小程序中的函数 1 函数的两种定义方法 2 带参函数 3 js中的默认函数 4 其它常用函数 四
  • vue在原有的类名上,动态渲染添加新类名

    vue在原有的类名上 动态渲染添加新类名
  • Redis相关-03

    Redis相关 03 Redis配置文件详解 持久化 RDB操作 持久化 AOF操作 Redis订阅发布 Redis集群环境搭建 主从复制 宕机手动配置主机 哨兵模式 缓存穿透以及雪崩 一 Redis配置文件详解 1 单位说明 Note o
  • S7-1500系列博途中使用SCL语言编程方法简介

    SCL Structured Contorl Language 结构化控制语言 在TIA博途软件中 默认支持SCL语言 在建立程序块时可以直接选择SCL语言 SCL语言类似计算机高级语言 如果你有C Java C Python这种高级语言的
  • gradle 历史版本下载链接

    https gradle org releases
  • 阿里云解决外网不能访问

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 未配置该端口安全策略 配置如下后 所有ip都可以访问 全部端口都可以使用了 如果只需要特定ip或端口开放也可以进行设置 2 防火墙的原因 我写了关于centos开启防火墙和开放
  • C# 1. 介绍

    1 介绍 C 读作 See Sharp 是一种简洁 现代 面向对象且类型安全的编程语言 C 起源于 C 语言家族 因此 对于 C C 和 Java 程序员 可以很快熟悉这种新的语言 C 已经分别由 ECMA International 和
  • 启动VMware虚拟机时出现黑屏解决办法

    以管理员身份运行 命令提示符 gt 输入命令 netsh winsock reset gt 运行后重启电脑 gt Enjoy it 上述命令作用 重置winsock网络规范
  • linux etc下的profile和/etc/bashrc

    etc profile的设置方法对所有登录的用户都有效 bashrc只对当前用户有效 上面两个都是配置文件 开机后 系统会先读取 etc profile 再读 bashrc 不同的用户 bashrc文件可以有不同的设置 而 etc prof
  • GitHub使用--上传一个文件

    上传文件到GitHub需要用到两个软件 分别是GitHub TortoiseGit 创建步骤如下 1 选择文件夹 2 右键选择 代码仓库 3 如果上传的文件根目录是这个 就不勾选 反之勾选 4 确认 5 文件右击选择commit 6 填写M
  • 扩展阿里p3c实现自定义代码规范检查

    前段时间fastjson报出了漏洞 只要打开setAutoType特性就会存在风险 自己测试环境的一个项目被揪出来了 虽然改动很小 但就是觉得憋屈 fastjson还是挺好的 想着禁用的话太可惜 用的话又要注意安全 就想着找款工具提示下在用
  • Node.js基础——模块

    文章目录 在Vscode上使用node js运行js代码 法一 终端运行 法二 右键Run Code Vsode设置node代码提示 CommonJS规范 模块化规范 JS标准的缺陷 没有模块化系统带来的影响 CommonJS的模块化规范