不同的浏览器使用不同的 JavaScript 解析引擎:
其中,Chrome 浏览器的 V8 解析引擎性能最好!
运行环境
指的是代码正常运行所需的必要条件。Node.js 的出现,使得JavaScript有了做后端开发的能力。
Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。然而,基于 Node.js 提供的这些基础功能,很多强大 的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位!
总之,Node.js 是大前端时代的“大宝剑”,有了 Node.js 这个超级 buff 的加持,前端程序员的行业竞争力会越来越强!
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
Node.js
是
一个基于 Chrome V8 引擎的 JavaScript
运行环境
。
通俗的理解:Node.js 为 JavaScript 代码的正常运行,提供的必要的环境。
Node.js 的官网地址: https://nodejs.org/zh-cn/
注意:
前端
运行环境。(浏览器是客户端安装的软件)后端
运行环境。(正常情况下,Nodejs要安装到服务器上)如果希望通过 Node.js 来运行 Javascript 代码,则必须在计算机上安装 Node.js 环境才行。
安装包可以从 Node.js 的官网首页直接下载,进入到 Node.js 的官网首页,点 击绿色的按钮,下载所需的版本后,双击直接安装即可。
建议使用 长期支持版
打开终端(黑窗口,或者蓝窗口),在终端输入命令 node –v
后,按下回车键,即可查看已安装的 Node.js 的版本号。
如果你能够看到版本号,说明你已经安装成功了。
此种方式,类似于浏览器调试工具的“Console”面板,只适合运行少量的测试代码,所以了解即可。
操作步骤:
此种方式,比较常用。可以运行写到 “xx.js
” 里面的JS代码,可以运行JS文件中的代码。
操作步骤:
node 要执行的js文件
”vscode自带终端:
xxx.js
文件上,鼠标右键 --> 在终端中打开 --> 出现一个终端窗口 --> node xxx.js
注意终端的路径,注意在此路径中,是否能找到你的js文件。
node xxx.js
这种格式// 用 node命令 执行 js 文件 ( 文件的路径相对或者绝对路径都可以)
node ./index.js
使用 ↑ 键,可以快速定位到上一次执行的命令
使用 tab 键,能够快速补全路径
使用 esc 键,能够快速清空当前已输入的命令
输入 cls 命令,可以清空终端
window7 的 powershell 问题: https://blog.csdn.net/appleyuchi/article/details/80155233
node 和 nodemon 问题: https://www.jianshu.com/p/321003445e13
vscode中无法使用node命令:用管理员权限打开 vscode
模块化,就是把一个大的文件拆分成若干小文件,而且还能把小文件通过特定的语法组合到一起的实现过程。
比如手机、电脑…等等几乎所有,都是模块化的设计,拿电脑来说,可以把电脑拆分成显示器、键盘、硬盘、内存等一个一个的小模块,当然也能够组装到一起。
模块化的优势:
Node中,规定每个JS文件都是一个小模块。一个项目由许许多多的小模块(JS文件)组合而成。
Node中模块化的优势:
Node使用的是CommonJS规范。
我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域,也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用。
module.exports
导出内容。
module
是Node中的一个全局对象,对象包含当前模块的详细信息。module.exports
是模块的出口,通俗的说,就是导出内容用的,默认值是 {}
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(功能模块)。也叫做核心模块。
下面介绍几个内置模块。
注意,加载内置模块,不能写路径,这是和加载自定义模块不一样的。
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
使用
加载模块
// 引入模块,引入模块的时候,可以使用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) | 监视文件 | |
… 一大堆 |
```js
// readFile -- 异步读取文件
fs.readFile('./test.json', (err, data) => {
if (err) {
console.log('读取文件出错');
} else {
console.log(data); // 读取到的二进制数据
console.log(data.toString()); // 得到原始数据
}
});
fs.readFile('./test.json', 'utf-8', (err, data) => {
if (err) {
console.log('读取文件出错');
} else {
console.log(data); // 读取到的原始数据
}
});
```
```js
// writeFile -- 异步写入文件
fs.writeFile('./abc.html', 'hello world', (err) => {
if (err) {
console.log('写入文件失败');
} else {
console.log('文件写入成功');
}
});
```
查询字符串(id=1&name=zs&age=20)处理模块
使用方法
加载模块
const querystring = require('querystring');
调用querystring模块中的方法
// parse -- 将查询字符串解析成JS对象
console.log(querystring.parse('id=1&name=zs&age=20'));
// { id: '1', name: 'zs', age: '20' }
// stringify -- 将JS对象转成查询字符串
console.log(querystring.stringify({ id: '1', name: 'zs', age: '20' }));
// id=1&name=zs&age=20
http服务器处理模块,可以使用http模块
搭建服务器
使用http模块搭建Web服务器
创建 Web 服务器的步骤
// 1. 加载http模块
const http = require('http');
// 2. 创建服务对象,一般命名为server
const server = http.createServer(); // create创建、server服务器
// 3. 给server对象注册请求(request)事件,监听浏览器的请求。只要有浏览器的请求,就会触发该事件
server.on('request', (req, res) => {
// 设置响应状态码
res.statusCode = 200;
// 设置响应头
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
// 设置响应体
res.end('hello,欢迎访问服务器,这是服务器给你的回应');
});
// 4. 设置端口,开启服务
server.listen(3000, () => {
console.log('服务器启动了');
});
上述代码的格式基本固定。只有 请求事件 的处理函数需要说明一下。
当收到浏览器的请求后,会触发request事件,事件处理函数有两个形式参数 req 和 res。
// 代码片段
server.on('request', function (req, res) {
// 该函数就是处理请求响应的函数
// 形参res是响应response的简写
})
浏览器在请求服务器的时候,默认会请求网站根目录下的
/favicon.ico
网站图标,先不要管它。
前面已经可以对浏览器的请求做出响应了,但是响应的内容总是一样的。能不能根据url的不同,做出合适的响应呢?当然可以,那么首先就需要知道浏览器请求的url是什么。
涉及到和请求相关的信息,都是通过请求响应处理函数的第一个参数完成的。
server.on('request', function (req, res) {
// 形参req 是 请求request的意思,所有和请求相关的信息,都在req对象中
})