Node.js
Node.js 诞生于2009年,Node.js采用C++语言编写而成,是 一个Javascript的运行环境。Node.js 是一个基于
Chrome V8 引擎的 JavaScript 运行环境 ,让JavaScript的运行脱离浏览器端,可以使用JavaScript语言
书写服务器端代码。
1、Node.js安装及使用
Node.js官网(https://nodejs.org/en/)下载稳定版本,node偶数版本为稳定版本,奇数版本为非稳定版本。
- mac 直接安装 或者 brew来安装
- 安装完Node.js会自动安装NPM(Node Package Manager):包管理工具;
- 通过指令 node -v 来查看是否安装完成和查看node版本号;npm -v 来查看npm版本。
2、通过Node.js搭建服务器
使用Node.js实现第一个服务器
初步感受Node.js
//引入http模块
let http = require("http");
//创建一个服务器
let serve = http.createServer((req,res)=>{
console.log("hello");
res.end("hello world");
})
//设置端口号
serve.listen(3000);
3、模块化及自定义模块
一、为什么会有模块化
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即,如今随着前端代码日益膨胀
这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,JavaScript极其简单的代码组织规范不足以驾驭如此庞大规模的代码;
二、Node.js中的模块化 commonjs规范
CommonJS就是为JS的表现来制定规范,因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。
1、创建自定义模块
- 引入一个文件 形式模块
home.js执行文件
//通过require来引入
require("./aModule"); //注意一定要有"./",文件后缀可加可不加。
amodule.js文件
console.log("我是amodule模块111");
- 引入文件夹形式模块
require("./aModuledir"); //必须加"./"
aModuleDir里的index.js文件,会自动查找文件夹下的index.js文件执行
console.log("我是aModule模块文件夹");
当然也可以配置默认启动文件,在文件夹内新建package.json来指定执行文件
{
"name":"aModule",
"version":"1.0.0",
"main":"test.js"
}
2、自定义模块的按需导出
通过module.exports 导出; ___dirname , __filename
module.exports = {
a:"我是a的值",
b(){
console.log("我是导出的b函数");
}
}
引入导出文件
let mymodule = require("bModule");
console.log(mymodule.a);
mymodule.b();
或者 通过 exports来导出
exports.fn = function(){
console.log("我是fn函数");
}
导入文件
let myfn = require("bModule").fn;
myfn();
// 或者 通过解构赋值
let {
fn } = require("bModule");
fn();
模块加载的优先级 ,先文件再目录;
关于modul.exports 和exports 的区别和require特性在另外一篇文章里详细的介绍
三、npm包管理器
NPM(Node Package Manager) 官网的地址是 npm官网
npm常用指令;
npm init:引导创建一个package.json文件 (或者npm init -y 所有东西默认选择yes) 用来初始化项目
在
npm help(npm -h) :查看npm帮助信息
npm version (npm -v) : 查看npm版本;
npm search:查找
npm install (npm i):安装 默认在当前目录,如果没有node_modules 会创建文件夹;
npm install module_name -S 或者--save 即 npm install module_name --save 写入dependencies
npm install module_name -D 或者 —save-dev 即 npm install module_name --save-dev 写入devDependencies
npm install module_name -g 全局安装(命令行使用)
指定版本安装模块 npm i module_name @1.0 通过 "@"符号指定;
npm update(npm -up):更新
npm remove 或者 npm uninstall:删除
npm root 查看当前包安装的路径 或者通过 npm root -g 来查看全局安装路径;
常用指令的详细介绍
1、npm init
npm init会生成一个pakeage.json文件,这个文件主要是用来记录这个项目的详细信息的,它会将我们在项目开发中所要用到的包,以及项目的详细信息等记录在这个项目中。便在以后的版本迭代和项目移植的时候会更加的方便。也是防止在后期的项目维护中误删除了一个包导致的项目不能够正常运行。使用npm init初始化项目还有一个好处就是在进行项目传递的时候不需要将项目依赖包一起发送给对方,对方在接受到你的项目之后再执行npm install就可以将项目依赖全部下载到项目里。
如果我们在进行package.json文件配置的时候写错了东西,或者后期要添加什么内容的话,我们是可以直接在项目的根目录中打开然后进行修改,也可以在配置文件中增加一个运行项目的命令
//package.json
{
"name": "xajd",
"version": "1.0.0",
"description": "我的第一个node项目",
"main": "app.js",
"dependencies": {
"koa": "^2.0.0",
"koa-router": "^7.4.0",
"mysql": "^2.17.1"
},
"devDependencies": {
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node app.js"//这个是我加入的一个配置,在窗口中执行npm start会自动执行start中的命令
},
"author": "wudi",
"license": "ISC"
}
启动项目时就可以运行
$ npm start
2、 npm install
npm install 命令用来安装模块到node_modules目录。
$ npm install <packageName>
安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。
如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f或–force参数。
$ npm install <packageName> --force
4、内置模块fs的使用
fs是文件操作模块,所有文件操作都是有同步和异步之分,特点是同步会加上 “Sync”
如:异步读取文件 “readFile”,同步读取文件 “readFileSync”;
文件操作
1、文件读取:
- 异步读取
let fs = require("fs");
fs.readFile("1.txt",(err,data)=>{
if(err){
return console.log(err);
}
console.log(data.toString());
})
- 同步读取
let fs = require("fs");
let res = fs.readFileSync("1.txt");
console.log(res.toString());
2、文件写入
let fs = require("fs");
//flag配置 "a":追加写入,"w":写入,"r":读取
fs.writeFile("2.txt","我是要写入的内容",{
flag:"w"},err=>{
if(err){
return console.log(err);
}
console.log("写入成功");
})
3、文件删除
fs.unlink("2.txt",err=>{
if(err){
return console.log(err);
}
console.log("删除成功");
})
4、复制文件
//先读取文件再写入文件
function mycopy(src,dest){
fs.writeFileSync(dest,fs.readFileSync(src));
}
mycopy("1.txt","4.txt");
5、修改文件名,目录也可以通过rename来操作
fs.rename("1.txt","5.txt",function (err) {
if(err){
console.log(err);
}else{
console.log("修改成功");
}
});
6、 判断文件是否存在
fs.exists("4.txt",function (exists) {
console.log(exists);
})
插入一个知识点是错误处理 同步:try catch 异步:错误回调优先
5、buffer及stream
buffer缓冲区
- buffer的创建
- 直接创建
- 数组创建
- 字符串创建
- 乱码的处理
- buffer转换tostring
stream流
- stream流:流与数据处理方面密不可分
- 流的原理
- 流数据的获取 pipe data end
- copy的流方法实现
- 加载视图的流方法实现