简介
node.js是浏览器的js引擎。 浏览器中有一个js引擎用来解析js代码,只能解析js代码中的ECMAScript,dom和bom的解析依赖的是浏览器本身。 将这个js引擎单独拿出来,就是node了。
node.js和js的关系:
要让这个引擎运行起来,有人将他做成了一个软件,安装在电脑上,js代码就不用依赖浏览器运行了,在电脑的命令 行也能运行js代码。 为什么要这么做?因为这样的话,js就能写后台了。
初体验
for(var i = 0; i < 5; i++){
console.log(i) //0 1 2 3
}
for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i) //4 4 4
})
}
for(var i=1;i<=3;i++){
(function(i){
setTimeout(function(){
console.log(i) //1 2 3
})
})(i)
}
编辑文件和文件夹基本命令
有许多基础的命令用来编辑文件和文件夹,包括mkdir, cp, mv, rm, rmdir以及vi。下面我们来简要地介绍一下这些命令。
mkdir
“make diretory”的缩写,用来创建文件夹,语法为mkdir后接新文件夹的目录。可以用-p选项,来一起创建路径中不存在的文件夹(这样你就不用挨层创建了)。
cp
“copy”的缩写,用来把文件从一处复制到另一处。语法为cp后接原始路径,后接目标路径。如果你想复制整个文件夹和所有内容,需要添加-R选项。如果指定的目标路径不含文件名,则 cp 命令会按原名复制。如果指定的目标路径包括文件名,则会复制为你指定的文件名。如果仅指定新文件名,则会在原处以新名称创建文件副本。注意,系统会自动替换同名文件而不出现提示。
mv
“move”的缩写,用来移动文件。语法为mv后接原路径,后接新路径。mv 的指定路径规则和 cp 是一样的(没错,如果仅指定新文件名,它就成了重命名命令)。
rm
“remove”的缩写,会永久删除文件。注意,command-line中没有废纸篓。语法为rm后接文件路径。然而,使用 rm 命令删除的文件有可能可以通过数据恢复工具恢复。如果希望安全删除文件,可以使用srm命令。
rmdir和rm -R
rmdir是“remove directory”的缩写,这个命令会永久删除文件夹。再强调一遍,CLI 中木有废纸篓。语法为rmdir后接希望删除目录的路径。然而,rmdir 命令无法删除含有任何其他文件的文件夹,所以大多数情形下rmdir命令是不适用的。不过,你可以利用rm添加-R选项来删除文件夹及包含的所有文件。
vi
代表“visual”(视觉的),然而这个名称相当具有讽刺意味:vi可能是可视化效果最差的文本编辑器了。然而,vi 是 command line 中最常见的文本编辑器。用vi打开文本文件,只需要输入vi后接文件路径即可。Mac OS X 还提供了nano,一个更加现代的文本编辑器。它也更加方便,例如在底部包含了一个作弊小条(=_=),上面有常用的快捷键列表(你就不用背下来它们了)。然而,vi却有时是默认的文本编辑器,所以掌握vi是很有用的。
和less命令类似,vi命令会占用整个 Terminal 空间来显示文件内容。打开后,在“command模式”,vi 会等你输入一些预定义字符来告诉 vi 你想做什么。你也可以使用键盘上的箭头键单纯地浏览文件。你想编辑时,按A开始(会进入编辑模式)。文字会插入到光标处。如果你想保存,需要先退出编辑模式进入 command 模式。方法是按下esc键。回到 command 模式后,按住shift同时按两次Z来保存并退出。如果你不想保存,在 command 模式输入:quit!并按enter
return直接退出。
读取文件
手册文档:http://nodejs.cn/api/url.html
require() - 文件引入 / 引入了一个文件:fs.js
fs.js 在 node.js系统内部
const fs = require('fs');
fs.readFile() 异步地读取文件的全部内容
fs.readFile('test.json',function(err,data){
//err - 读取失败
//读取成功,err就是null
//data是读取成功之后的读取出来的数据
//判断是否有错误
if(err){
console.log(`读取信息存在错误,错误信息是:${err}`);
return;
}
//运行到此处,说明if中代码没有执行,没有错误
console.log(data);//默认读取出来的是一个 buffer 数据(16进制)
console.log(data.toString());//转成toStirng()
})
console.log(data);
console.log(`异步的标志`);
//异步读取文件
fs.readFile('test.json','utf-8',(err,data)=>{
if(err){
console.log(`错误了,错误信息是:${err}`);
return
}
console.log(data);//加上可选项编码可不加toString()
})
console.log(data);
console.log(`异步的标志`);
fs.readFileSync() - 同步获取文件
//同步获取文件
var data = fs.readFileSync('test.json','utf-8')
console.log(data);
console.log(`异步的标志`);
writeFile() - 异步写入 / 文件不存在则自动创建
fs.writeFile('test.json','hello nodejs','utf-8',err=>{
if(err){
console.log(`错误了,错误是:${err}`);
return;
}
console.log(`写入成功`);
})
console.log('异步标志');
writeFileSync() - 同步写入
fs.writeFileSync('test.json','hello ECMAScript','utf-8');
console.log('写入成功');
console.log('异步标志');
nodejs 创建服务器,实现apache的过程
//引入内置文件 http.js 引入js文件可以省略.js
const http = require('http');
//创建服务器
let server = http.createServer(function(request,response){
// console.log(request);
//request - url属性 请求的路径
// console.log(request.url);
//响应 - end方法
// response.end('ok')
//设置响应头避免乱码
// response.writeHead(208,'sucess',{
// 'content-type':'text/html;charset=utf-8'
// })
response.setHeader('content-type','text/html;charset=utf-8');
response.end('这是我自己创建的服务器哦');
})
//监听端口
//server.listen(9527) - 端口号建议7000以上,防止冲突
require('http').createServer((req,res)=>{
res.end('6666')
}).listen(8848)
模块化开发
在 node js 中一个文件就是一个模块,每个文件都有自己的作用域,系统提供的模块如:fs.js/http.js/url.js/vm.js/domain.js ...
自定义模块 - 自己定义的文件
让a.js将数据暴露给b.js
第三方模块:别让写好的模块,直接下载下来就能使用 - 如:jQuery/Swiper/Bootstrap/Vue/jQuery-validate ...
下载工具
下载工具可以不用去官网 - npm
nodejs自带npm工具
测试工具:npm -v - 弹出版本信息说明已经安装nodejs
npm下载: npm install 模块名称 - 可简写:npm i 模块名称 - 下载多个模块:npm i 模块1 模块2 模块3 ...
下载会自动生成一个文件夹 :node_modules/下载好的模块
指定版本下载:npm i 模块名@版本号 - 默认下载最小版本
卸载命令:npm uninstall 模块名称
初始化命令:npm init
新建项目之后执行命令完以后会生成一个 package.json文件,文件中会记录所有项目中以来过的模块
项目上线的时候,将项目文件和package.json上传到服务器中,服务器中执行命令:npm i 将记录好的所有模块都下载
nrm工具
nrm - 管理npm下载地址
需要下载使用:npm i 工具名称 -g
-g/--global - 全局安装,安装后可在电脑任何地方使用
测试工具: nrm --version 有版本号代表已经安装
测试网速:nrm test / nrm ls(详细信息包含地址)
切换下载地址:nrm use 地址名
cnpm - 中国下载工具,与npm使用一样,大陆建议使用 cnpm
需要下载使用:npm i cnpm -g
可能Windows下载会报错,解决方案:找到 C:/Users/Adminstrator/AppData/Roaming/npm/node_modules/nrm/cli.js 的第17行,将 process.env.HOME 改成 process.env.USERPROFILE 或 process.env.HOME?process.env.HOME:process.env.USERPROFILE
//console.log(process.env.HOME) 为undefined报错,正确则为路径
cnpm
cnpm -v -查看版本
cnpm i 模块名称 - 下载模块
cnpn uninstall 模块名称 - 卸载模块
注:cnpm如果没有提前初始化,不存在package.json文件,则会卸载失败;且初始化后,下载模块时需要加一个参数:-s(--save),表示保存当前的package.json文件中,以后可以 使用cnpm i 进行安装。
扩展:下载模块,参数加 -d(--save-dev),表示下载的模块只在本地使用,服务器使用cnpm i 时不安装这个模块。
cnpm init - 初始化命令
注:cnpm init 的时候,package.json文件夹中的 name键的值不允许是中文,初始化的时候需要手动填写name,不然默认是以文件夹的名称来命名。
扩展:cnpm init -y ,初始化全部使用默认值来创建package.json,这里文件夹名必须是英文,否则报错。