node.js是什么
node.js是一个运行环境(V8 + 内置API)
内置API:
fs模块(读写)
const fs = require('fs') fs.readFile('文件路径','utf-8',(err,data) => { // err代表错误 if(err) { console.log('读取失败,错误信息为:'err.message) } // data代表成功的结果 console.log(data) }) fs.writeFile('文件路径','写入的内容',(err) => { // err代表错误 if(err) { console.log('写入文件失败:'err) } console.log('写入文件成功') })
path模块(配置路径)
const path = require('path') // path.join 拼接路径 __dirname绝对路径 拼接上具体的地址,可以实现在任意位置访问具体的地址 const url = path.join(__dirname, '具体的路径')
http模块(本地服务器)
const fs = require('fs') const path = require('path') const http = require('http') // 启动服务 const server = http.createServer() // 注册request事件 server.on('request', (req, res) => { // req是请求 res是响应 // req.url() 请求路径 req.method() 请求方式 // path.join 拼接路径 __dirname绝对路径 拼接上具体的地址,可以实现在任意位置访问具体的地址 const url = path.join(__dirname, './index.html') console.log(req.url) // 如果为默认的地址,则跳转到index.html 页面 if (req.url === '/') { req.url = '/index.html' } if (req.url === '/index.html') { // console.log('有人来啦') fs.readFile(url, 'utf-8', (err, data) => { if (err) { // err.message 失败信息 return console.log('读取失败', err.message) } // data 成功的结果 console.log(data) // 为了防止中文显示乱码的问题,需要设置响应头 Content-Type的值为 text/html; charset=utf-8 // 请求头必须设置在end上方 否则不生效 res.setHeader('Content-Type', 'text/html; charset=utf-8'); const str = `这个是请求路径 ${req.url},这个是请求方式 ${req.method}`; // res.end()方法的作用: 向客户发送指定的内容, 并结束这次请求的处理过程 res.end(str) }) } else { console.log('404 Not Default') } }) server.listen(8080, () => { console.log('启动成功') })
模块化
node.js一个js文件就是一个模块(自定义模块)
node.js遵守common.js语法规范
导入(引入) require()
无论是内置的、自定义、第三方模块,都是require导入
区别
- 内置的:第三方模块 require(‘模块名’)
- 自定义 require(‘相对路径’)
导出(把模块内给共享出去)
module.exports.xxx = yyy
module.exports = {xxx}
require()的结果就是模块导出的对象 (module.exports)
npm(包管理工具)
下包 npm i 包名1 包名2 包名3
卸载 npm un 包名
下指定版本的包 npm i 包名@指定版本号
下包之前 通常会有一个初始化操作 npm init -y
全局包 nrm 可以提供(切换)下包的服务器
下nrm包:npm i nrm -g -g表示全局以后可全局使用
查看有哪些服务器: nrm ls
测速: nrm test
使用:nrm use taobao
npm 下包 nrm切换下包服务器
本地安装 npm i 包名 包只能在当前项目中使用 会下载到node_modules 目录中
- 如果在GitHub或者码云上克隆下来的项目,没有node_modules目录是正常的
- 执行npm i 会找package.json里面的dependecies,并且安装所有的包
全局安装 npm i 包名 -g 包会提供命令,实在终端中使用
卸载全局包 npm un 包名 -g
nodemon
只要文件修改了,自动重启
下包:npm i nidemon -g
使用nodemon 执行的js文件
退出 ctrl + c
node 执行对应js文件
npm 下包 卸载包 工具
nrm 切换下包的服务器
nodemon 执行对应js文件,只要文件修改了,自动重启
ES6模块语法
ES6 模块化规范是浏览器端与服务器端通用的模块化开发规范。
ES6 模块化规范中定义:
- 每个 js 文件都是一个独立的模块
- 导入其它模块成员使用
import
关键字 - 向外共享模块成员使用
export
关键字
ES6 的模块化主要包含如下 3 种用法:
- 默认导出与默认导入
- 按需导出与按需导入
- 直接导入并执行模块中的代码
在nodejs环境中,想要使用ES6模块化语法,在 package.json
文件中 "type": "module"
默认导出与默认导入
默认导出的语法: export default 默认导出的成员
默认导入的语法: import 接收名称 from '模块路径'
- 导出
const a = 10
const b = 20
const fn = () => {
console.log('这是一个函数')
}
// 默认导出
// export default a // 导出一个值
export default {
a,
b,
fn
}
- 导入
// 默认导入时的接收名称可以任意名称,只要是合法的成员名称即可
import result from './xxx.js'
console.log(result)
注意点:
- 每个模块中,只允许使用唯一的一次
export default
- 默认导入时的接收名称可以任意名称,只要是合法的成员名称即可
按需导入与按需导出
按需导出的语法: export const s1 = 10
按需导入的语法: import { 按需导入的名称 } from '模块标识符'
export const a = 10
export const b = 20
export const fn = () => {
console.log('内容')
}
按需导入的语法
import { a, b as c, fn } from './xxx.js'
注意事项:
- 每个模块中可以有多次按需导出
- 按需导入的成员名称必须和按需导出的名称保持一致
- 按需导入时,可以使用as 关键字进行重命名
- 按需导入可以和默认导入一起使用
直接导入模块(无导出)
如果只想单纯地执行某个模块中的代码,并不需要得到模块中向外共享的成员。
此时,可以直接导入并执行模块代码,示例代码如下:
import '模块的路径'
//xxx.js
for (let i = 0; i < 10; i++) {
console.log(i)
}
// 导入该模块
import './xxx.js'