node.js入门学习(一)环境安装,REPL,fs模块,path模块,http模块
目录:
一、node.js介绍
二、node.js有哪些特点
三、下载安装node.js,配置环境变量
四、node.js开发网站和传统PHP等开发网站的区别
五、REPL介绍
六、helloworld程序
七、案例:输出一个三角形
八、fs写入文件和读取文件
九、__dirname和__filename获取正在执行的js文件的路径
十、使用path模块进行路径拼接
十一、通过http模块构建一个简单的http服务程序
十二、Buffer
一、node.js介绍 <--返回目录
1.1、node.js是什么
官网首页总结:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时。
1)node.js是一个开发平台,就像java开发平台、.net开发平台、PHP开发平台、Apple开发平台一样。
- 什么是开发平台:有对应的编程语言、有语言运行时、有能实现特定功能的API(SDK Software Development Kit)
2)node.js平台使用的编程语言是JavaScript。
3)node.js平台是基于Chrome V8 JavaScript 引擎构建。
1.2、node.js可以做什么
1)基于node.js可以开发控制台程序(命令行程序、CLI程序)、桌面应用程序(GUI,要借助node-webkit、electron等框架实现)、web应用程序(网站)
2)PHP开发技术栈:LAMP - Linux Apache MySQL PHP
3)node.js全栈开发技术栈:MEAN- MongoDB Express Angular Node.js
二、node.js有哪些特点 <--返回目录
1)事件驱动:当事件被触发,执行传递过去的回调函数
2)非阻塞I/O模型:当执行I/O操作时,不会阻塞线程
3)单线程
4)拥有世界最大的开源库生态系统-npm
node.js在处理高并发、I/O密集场景性能优势明显。
- CPU密集:压缩、解压、加密、解密
- I/O密集:文件操作、网络操作、数据库操作
web常见场景:静态资源读取、数据库操作、渲染页面。
node.js的单线程:单线程只是针对主进程,I/O操作系统底层多线程调度。
三、下载安装node.js,配置环境变量 <--返回目录
node.js官方网站:https://nodejs.org/
中文网: http://nodejs.cn/
中文社区:https://cnodejs.org/
下载win 64为安装包:node-v10.16.0-x64.msi,双击安装

为了在任何目录下都可以使用node和npm命令,将这两个命令添加到环境变量path。我安装node时默认就添加到了环境变量。

四、node.js开发网站和传统PHP等开发网站的区别 <--返回目录
1)传统php、java、asp.net开发web程序需要web容器
2)node.js本身就是web服务器
- 接收用户请求后,根据不同的请求直接做对应处理
- 把处理后的结果返回给浏览器
五、REPL介绍 <--返回目录
1)REPL全称Read Eval Print Loop交互式解释器
- R 读取,读取用户输入,解析输入js数据结构并储存在内存中
- E 执行,执行输入的数据结构
- P 打印,输出结果
- L 循环,循环操作以上步骤直到用户两次按下Ctrl+c按钮退出
2)在REPL中编写程序,类似于浏览器开发人员工具中的控制台功能。
3)直接在控制台输入node命令,进入REPL环境。
4)按两次Ctrl+c 或者输入 .exit ,退出REPL界面

六、helloworld程序 <--返回目录
新建一个helloworld.js
var m = 10;
var n = 20;
function add(x, y) {
return x + y;
}
console.log(m + "和"+ n + "相加,等于" + add(m,n));
在包含helloworld.js文件的目录下,shift+右键,在此处打开命令窗口;输入命令 node hel(tab补全),控制台会打印结果。

七、案例:输出一个三角形 <--返回目录
process模块是全局模块,直接使用;
for(var i = 0; i <10; i++) {
for(var j = 0;j <=i; j++) {
process.stdout.write("* ");
}
console.log();
}
八、fs写入文件和读取文件 <--返回目录
process模块是全局模块,直接使用;fs不是全局模块,要用require加载
fs写入文件:
// 加载文件操作fs模块
var fs = require("fs");
// 文件写入
// fs.writeFile('文件路径','数据','选项',function(){});
fs.writeFile('./a.txt','hello world', 'utf-8', (err) => {
// 如果err===null,表示写入文件成功
// 只要err不是null,就表示写入文件失败
if (err) {
throw err;
console.log("数据写入失败: " + err);
} else {
console.log("数据写入成功");
}
});


fs文件追加内容:
fs.appendFile('./test.txt', 'bbbb', 'utf8', err => {
console.log('done')
})
fs读取文件:
// 加载文件操作fs模块
var fs = require("fs");
// fs.ReadFile('文件路径','选项',function(){});
// 文件路径'a.txt'是相对于执行node命令的路径
fs.readFile('./a.txt','utf-8',(err,data) => {
if (err) {
throw err;
console.log("数据读取失败");
} else {
console.log(data);
}
});
fs.stat() 判断是文件还是文件夹
fs.stat('./a.js', (err, stats) => {
if (err) {
console.log('文件不存在'); // 一般可以用来判断文件是否存在
return;
};
console.log(stats.isFile());
console.log(stats.isDirectory());
console.log(stats);
});
fs.rename() 重命名
fs.rename('./text', 'test.txt', err => {
if(err) throw err;
console.log('done!');
});
fs.unlink() 删除
fs.unlink('./test.txt', err => {});
fs.readdir() 读取文件夹内容
fs.readdir('../', (err, files) => {
if (err) throw err;
console.log(files);
})
fs.mkdir() 创建目录
fs.mkdir('test', err => {});
fs.watch() 监视文件或文件夹的变化
fs.watch('./', {recursive: true}, (eventType, filename) => {
console.log(eventType, filename);
});
fs同步的方法
const fs = require("fs");
// 同步的读取
var data = fs.readFileSync("./test.txt", 'utf8');
console.log("文件读取完成, data: ", data);
//同步的写入
fs.writeFileSync("./test.txt", '很好', 'utf8');
//同步的追加
fs.appendFileSync("./test.txt", '呵呵', 'utf8');
九、__dirname和__filename获取正在执行的js文件的路径 <--返回目录
前面的程序都是在hello.js所在目录执行node ./hello.js命令。如果进到c盘,执行node D:\hello.js命令,结果:

__dirname表示当前正在执行的js文件的所在目录;__filename表示当前正在执行的js文件的完整路径
//fs读取文件
// 加载文件操作fs模块
var fs = require("fs");
// fs.writeFile('文件路径','选项',function(){});
// fs.readFile(__dirname+'\\a.txt','utf-8',(err,data) => {
fs.readFile(__dirname+'/a.txt','utf-8',(err,data) => {
if (err) {
throw err;
console.log("数据读取失败");
} else {
console.log(data);
}
});
所以,"./hello.js"中./是相对于执行node命令的路径,而不是相对于当前js文件的路径。
__dirname和__filename不是全局的,但是为什么使用的时候不需要通过require引入:
(
function ("__dirname", "__filename") {
//fs读取文件
// 加载文件操作fs模块
var fs = require("fs");
// fs.writeFile('文件路径','选项',function(){});
// fs.readFile(__dirname+'\\a.txt','utf-8',(err,data) => {
fs.readFile(__dirname+'/a.txt','utf-8',(err,data) => {
if (err) {
throw err;
console.log("数据读取失败");
} else {
console.log(data);
}
});
}
)("当前正在执行的js文件的所在目录","当前正在执行的js文件的完整路径");
总结:__dirname、__filename总是返回文件的绝对路径;
process.cwd()总是返回执行node命令所在文件夹;
require()方法总是相对当前文件;
pahth.resolve('./')是执行node命令所在文件夹
十、使用path模块进行路径拼接 <--返回目录
path会根据系统拼接成对应的路径,windows下格式是 \a\b\c
var path = require('path');
var str = path.join('/foo','bar','baz/asdf');
console.log(path);
process.stdout.write(str); // \foo\bar\baz\asdf
const path = require('path')
// normalize: 将路径解析成标准的格式
console.log(path.normalize('/usr/local//bin')) // \usr\local\bin
console.log(path.normalize('/usr/local/../bin')) // \usr\\bin
// resolve: 将相对路径解析成绝对路径
console.log(path.resolve('./')) // D:\当前文件所在目录名
// basename: 取文件名, dirname: 文件夹, extname: 扩展名
const pathName1 = path.basename('c:/a/b.js')
console.log(pathName1) // b.js
const pathName2 = path.basename('c:\\a\\b.js')
console.log(pathName2) // b.js
const filePath = '/usr/local/bin/a.txt'
console.log(path.basename(filePath)) // a.txt
console.log(path.dirname(filePath)) // /usr/local/bin
console.log(path.extname(filePath)) // .txt
console.log('='.repeat(50))
// parse format
const parseResult = path.parse(filePath)
console.log(parseResult) // {root:'/', dir:'/usr/local/bin', base:'a.txt', ext:'.txt', name:'a'}
// parseResult对象中dir和base优先级高,即有这个两个属性,其他属性值忽略掉。因为有dir和base属性就可以完全拼接出完整的文件名
console.log(path.format(parseResult)) // /usr/local/bin\a.txt
const path = require('path')
// sep delimiter win32 posix
console.log('当前系统下sep: ', path.sep)
console.log('win sep:', path.win32.sep)
console.log('posix sep', path.posix.sep)
console.log('PATH: ', process.env.path)
console.log('当前系统下delimiter: ', path.delimiter) // delimiter是PATH的分隔符
console.log('win delimiter: ', path.win32.delimiter)
console.log('posix delimiter: ', path.posix.delimiter)

十一、通过http模块构建一个简单的http服务程序 <--返回目录
第一步:在d:/hello.js写代码:
// 加载http模块
var http = require("http"); // 创建一个http服务对象
var server = http.createServer(); // 监听用户的请求
server.on('request', function(req,res) {
res.setHeader('content-type','text/html;charset=utf-8');
res.write('<h1>hello 您好!</h1>');
res.end();//结束响应
}); // 开启服务
server.listen('8080', function() {
console.log('服务器已经启动。');
});
第二步:cmd窗口输入node D:\hello.js运行程序
第三步:浏览器输入http://localhost:8080。
十二、Buffer <--返回目录
Buffer用于处理二进制数据流,类似数组,但是Buffer大小固定。
构造Buffer
console.log(Buffer.alloc(5)) // 默认0填充
console.log(Buffer.alloc(5, 1)) //0x1填充
console.log(Buffer.allocUnsafe(5)) // 保持原有数据
console.log(Buffer.from([1, 2, 3]))
console.log(Buffer.from('test')) // 默认utf-8编码
console.log(Buffer.from('test', 'base64'))
Buffer的byteLength()、isBuffer()、concat()方法
/*
Buffer.byteLength()
Buffer.isBuffer()
Buffer.concat()
*/
console.log(Buffer.byteLength('test')) //
console.log(Buffer.byteLength('测试')) // 6, utf-8编码 console.log(Buffer.isBuffer({})) // false
console.log(Buffer.isBuffer(Buffer.from([1, 2, 3]))) // true const buf1 = Buffer.from('hello')
const buf2 = Buffer.from('世界')
const buf3 = Buffer.from('!')
const buf = Buffer.concat([buf1, buf2])
console.log(buf.toString()) // hello世界!
buf.length、buf.toString([encoding])、buf.fill(value[, start, end])
const buf = Buffer.allocUnsafe(10)
buf[2] = 0xff
console.log(buf.length)
console.log(buf) buf.fill(0xff)
console.log(buf) const buf2 = Buffer.from('hello world')
console.log(buf2.toString())
console.log(buf2.toString('base64'))
buf.equals()、buf.indexOf()
const buf1 = Buffer.from('test')
const buf2 = Buffer.from('test')
console.log(buf1.equals(buf2)) // 比较内容是否相同,true
console.log(buf1.indexOf('te')) //
console.log(buf1.indexOf('abc')) // 找不到,返回-1
---
node.js入门学习(一)环境安装,REPL,fs模块,path模块,http模块的更多相关文章
- node.js入门学习(五)--Demo模块化改造
1.node.js中模块的分类 1)node.js内置模块(核心,原生) 所有内置模块在安装node.js时就已经编译成二进制文件,可以直接加载运行(速度较快),部分内置模块,在node.exe这个进 ...
- node.js介绍及Win7环境安装测试(转)
官网描述: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...
- node.js入门学习(四)--Demo图书的增删改查
需求:图书的增删改查,图书数据保存在data.json文件中. 1.Demo结构: 2.首先下载安装node.js,配置环境变量:参考博客 3.项目初始化 1)创建项目根目录node-hello,进入 ...
- Node.js入门学习笔记(一)
先来个最常见的"Hello World!". 打开你最喜欢的编辑器(我用的是Sublime Text),创建一个helloWorld.js的文件.我们要做的就是向stdout输出& ...
- node.js 入门(一)安装
从 https://nodejs.org/ 下载最新版的node.js 下载完成后,双击安装, 一路点击"Next"按钮即可. 等出现上图及表示安装成功. 按"win+r ...
- node.js入门学习笔记整理
(1)node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node与javaScript的区别在于,javaScript的顶层对象是window,而no ...
- node.js入门学习(三)--npm
一.npm介绍 1)npm:node package manager是node.js默认的以js编写的软件包管理系统 官网:www.npmjs.com 文档:docs.npmjs.com 2)提到np ...
- Node.js入门学习笔记(三)
基于事件驱动的回调 这个问题不好回答,不过这是Node.js原生的工作方式.它是事件驱动的,这也是它为什么这么快的原因.你可以花一点时间阅读一下Felix Geisendörfer的大作 Unders ...
- node.js入门学习(二)MIME模块,request和response对象,demo之不同url请求不同html页面,页面包含图片、样式css等静态资源
一.构建http服务程序-根据不同请求做出不同响应 // 加载http模块 var http = require("http"); // 创建一个http服务对象 http.cre ...
随机推荐
- DHCP迁移
情况1:windows 2003迁移到windows 2003或者windows 2008,按照需要以下几个步骤:1.在源DHCP服务器导出DHCP数据文件,执行以下命令netsh dhcp serv ...
- 使用Spring Initializr初始化SpringBoot项目
虽然SpringBoot CLI消除了不少设置工作,但如果你更倾向于传统的Java项目结构,那你应该看看Spring Initializr. Spring Initializr从本质上来说就是一个we ...
- reactstrap,scrollbar组件
react-script 编译,部署,sass,less,test,helmet等 https://github.com/facebookincubator/create-react-app/blob ...
- C# 流与文件(Stream & File & byte[])
原文:https://www.cnblogs.com/long-gengyun/archive/2010/03/28/1698681.html 文件概述 文件在操作时表现为流,即流是从一些输入中读取 ...
- PostgreSQL数据库表的内部结构
A page within a table contains three kinds of data described as follows: heap tuple(s) – A heap tupl ...
- 几张图让你看懂WebAssembly
几张图让你看懂WebAssembly:https://www.jianshu.com/p/bff8aa23fe4d
- empty() 为true
//empty() 为truevar_dump(empty(0));var_dump(empty('0'));var_dump(empty(array()));var_dump(empty(null) ...
- Win7(64位)下安装Anaconda+Tensorflow(CPU)
一.安装Python 3.5 下载Anaconda网址:https://www.anaconda.com/download/ 安装:Anaconda3-4.2.0-Windows-x86_64.exe ...
- uoj218_火车管理
题意 \(n\)个位置,每个位置一个栈,三种操作,询问区间栈顶的和,区间入栈某个数,单点出栈某个数. 分析 用一个线段树来维护栈顶的和,区间(单点)更新和区间询问. 用一个主席树来维护每个位置最新一次 ...
- css3的calc属性不生效问题
css3的 calc:计算属性.由于自己做的项目中这个属性不常用到,偶尔用一次还没效果. 后来研究了下是因为运算符两边没加空格. 错误示例:.content{width:calc(100%-50px) ...