Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。
什么是 Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js
是
一个基于 Chrome V8 引擎的 JavaScript
运行环境
。
通俗的理解:Node.js 为 JavaScript 代码的正常运行,提供的必要的环境。
Node.js 的官网地址: Node.js
注意:
-
浏览器是 JavaScript 的
前端
运行环境。(浏览器是客户端安装的软件) -
Node.js 是 JavaScript 的
后端
运行环境。(正常情况下,Nodejs要安装到服务器上) -
Node.js 中无法调用 DOM 和 BOM 等 浏览器内置 API。
在Node.js环境中运行JavaScript
终端窗口运行(了解)
此种方式,类似于浏览器调试工具的“Console”面板,只适合运行少量的测试代码,所以了解即可。
操作步骤:
-
打开任意终端,直接输入 node 命令并回车
-
执行你的JS代码,按回车表示执行
-
按两次“Ctrl+C”退出。
使用node命令执行JS文件(掌握)
此种方式,比较常用。可以运行写到 “xx.js
” 里面的JS代码,可以运行JS文件中的代码。
操作步骤:
-
打开终端
-
输入 “
node 要执行的js文件
”
vscode自带终端:
-
xxx.js
文件上,鼠标右键 --> 在终端中打开 --> 出现一个终端窗口 -->node xxx.js
注意终端的路径,注意在此路径中,是否能找到你的js文件。
常见问题
-
如果在vscode终端中,运行node命令报错,重启vscode。
-
执行node的路径一定要对(vscode中,文件上右键,在终端中打开,这样的路径肯定是对的)
-
执行文件的时候,需要保证
node xxx.js
这种格式 -
node只能运行JS代码(也就是不要 node xxx.html)
-
注意,最好不要使用多个终端
终端命令
用 node命令 执行 js 文件 ( 文件的路径相对或者绝对路径都可以)
node ./index.js
使用 ↑ 键,可以快速定位到上一次执行的命令
使用 tab 键,能够快速补全路径
使用 esc 键,能够快速清空当前已输入的命令
输入 cls 命令,可以清空终端
模块化
什么是模块化
模块化,就是把一个大的文件拆分成若干小文件,而且还能把小文件通过特定的语法组合到一起的实现过程。
比如手机、电脑....等等几乎所有,都是模块化的设计,拿电脑来说,可以把电脑拆分成显示器、键盘、硬盘、内存等一个一个的小模块,当然也能够组装到一起。
优点
模块化的优势:
-
更利于维护(比如电脑屏幕坏了,只换屏幕就可以了;比如想升级显卡,只换显卡就行了);
-
更好的复用性(比如有一块移动硬盘或U盘,大家都能用)
Node中,规定每个JS文件都是一个小模块。一个项目由许许多多的小模块(JS文件)组合而成。
Node中模块化的优势:
-
更利于维护(比如,项目需要对登录模块升级,则不会影响其他模块)
-
更好的复用性(比如有一个公共的函数,封装起来。其他所有JS文件都能使用这个函数)
了解几种模块化规范
-
AMD
-
CMD
-
CommonJS(Node中的模块化,使用的是这种方案)
-
ES6
Node使用的是CommonJS规范。
模块的分类
-
自定义模块
-
NodeJS中,创建的JS文件都是自定义模块。(也就是处处皆模块)
-
-
内置模块(核心模块)
-
安装Node之后,自带了很多内置模块。我们可以直接加载使用他们。
-
-
第三方模块
-
其他人编写的模块,发布到 npm 网站 上,我们可以下载使用。
-
自定义模块
我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域,也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用。
-
共享(导出/暴露)内容给其他模块用,需要使用
module.exports
导出内容。-
module
是Node中的一个全局对象,对象包含当前模块的详细信息。 -
module.exports
是模块的出口,通俗的说,就是导出内容用的,默认值是{}
-
比如,02-test.js 导出 age、name、fn 给其他模块用,可以
module.exports = {age, name, fn}
-
-
其他模块,如果需要使用上述模块导出的内容,可以使用
require()
加载-
let 结果 = require('模块路径')
-
比如,
let test = require('./02-test');
-
加载自定义模块,必须加路径,即使是
./
也必须加。但是可以省略后缀。
-
示例:
02-test.js -- 导出内容
let age = 30; let name = 'laotang'; let height = '175cm'; let weight = '75kg'; let square = x => x * x; // 导出age、name、fn给其他模块使用 module.exports = { age, name, square };
03-use.js -- 导入内容
let test = require('./02-test'); console.log(test); // { age: 30, name: 'laotang', square: Function... }
一个模块导出什么,另一个模块加载后,就会得到什么。
就比如,我给你三个苹果,你只能得到三个苹果,不可能得到其他的。
内置模块
内置模块是Node.js 平台自带的一套基本的 API(功能模块)。也叫做核心模块。
下面介绍几个内置模块。
注意,加载内置模块,不能写路径,这是和加载自定义模块不一样的。
fs模块
-
fs,即 file system,文件系统,该模块可以实现对 文件、文件夹的操作
-
使用
-
加载模块
// 引入模块,引入模块的时候,可以使用var、let,但是建议使用const,因为我们不希望它改变 const fs = require('fs');
-
调用fs模块的方法,下面列举fs模块中的常用方法
API 作用 备注 fs.access(path, callback) 判断路径是否存在 fs.appendFile(file, data, callback) 向文件中追加内容 fs.copyFile(src, callback) 复制文件 fs.mkdir(path, callback) 创建目录 fs.readDir(path, callback) 读取目录列表 fs.rename(oldPath, newPath, callback) 重命名文件/目录 fs.rmdir(path, callback) 删除目录 只能删除空目录 fs.stat(path, callback) 获取文件/目录信息 fs.unlink(path, callback) 删除文件 fs.watch(filename[, options][, listener]) 监视文件/目录 fs.watchFile(filename[, options], listener) 监视文件 ..... 一大堆 // readFile -- 异步读取文件 fs.readFile('./test.json', (err, data) => { if (err) { return console.log('读取文件出错'); } console.log(data); // 读取到的二进制数据 });
// writeFile -- 异步写入文件 fs.writeFile('./abc.html', 'hello world', (err) => { if (err) { return console.log('写入文件失败'); } console.log('文件写入成功'); });
-
path模块
-
path
是 Node 本身提供的 API,专门用来处理路径。
-
使用
-
加载模块
// 使用核心模块之前,首先加载核心模块 let path = require('path'); // 或者 const path = require('path');
-
调用path模块中的方法,来处理相应的问题,下面列举path模块中的几个方法
方法 作用 path.basename(path[, ext]) 返回 path 的最后一部分(文件名) path.dirname(path) 返回目录名 path.extname(path) 返回路径中文件的扩展名(包含.) path.format(pathObject) 将一个对象格式化为一个路径字符串 path.join([...paths]) 拼接路径 path.parse(path) 把路径字符串解析成对象的格式 path.resolve([...paths]) 基于当前工作目录拼接路径 const path = require('path'); // extname -- 获取文件后缀 console.log(path.extname('index.html')); // .html console.log(path.extname('index.coffee.md')); // .md // join -- 智能拼接路径 // ------------------- 智能拼接路径 ----------------------------- // console.log(path.join('a', 'b', 'c')); // a/b/c // console.log(path.join('a', 'b', 'c', 'index.css')); // a/b/c/index.css // a里面有b,b里面有../c,言外之意,c和b同级。 // console.log(path.join('a', 'b', '../c', 'index.js')); // a/c/index.js // __dirname 永远表示当前js文件的绝对路径 console.log(path.join(__dirname, 'css', 'demo.css')); // /Users/tangfengpo/Study/123/Node01/code/css/demo.css
-