写一个可以生成多层级文件夹的函数

const fs = require('fs');
const path = require('path');
function mkdirs (pathname,callback){
 
var root = path.dirname(module.parent.filename);
 
pathname = path.isAbsolute(pathname)?pathname:path.join(__dirname,pathname);
 
relativepath = path.relative(__dirname,pathname);
 
var folders = relativepath.split(path.sep);
try {
 
var pre = '';
folders.forEach(folder =>{
 
try {
//如果不存在则报错
fs.statSync(path.join(__dirname,pre,folder));
} catch (error) {
fs.mkdirSync(path.join(__dirname,pre,folder));
}
pre = path.join(pre, folder);
});
 
callback && callback(null);
} catch (error) {
callback && callback(error);
}
}
module.exports = mkdirs;
 
 
写一个读取markdown然后转换成html最终使用browsersync加载的服务器:
 
//markdown文件自动转换
const fs = require('fs');
const path = require('path');
const marked = require('marked');
var browserSync = require("browser-sync");
//接受需要转换的文件路径
const target = path.join(__dirname,process.argv[2]||'../README.md');
var filename = target.replace(path.extname(target),'.html');
var indexpath = path.basename(filename);
// 通过browsersync创建文件服务器
browserSync({
server: path.dirname(target),
index:indexpath
});
//监视文件变化
fs.watchFile(target,{interval:200},(curr,prev)=>{
console.log(`current : ${curr.size} ; previous:${prev.size}`);
//判断文件到底有没有变化
 
if(curr.mtime == prev.mtime ){
return false;
}
//读取文件,转换为新的HTML
fs.readFile(target,'utf8',(err,content)=>{
 
if(err)
{
throw err;
}
 
var html = marked(content);
fs.readFile(path.join(__dirname,'github.css'),'utf8',(err,css)=>{
html = template.replace('{{{content}}}',html).replace('{{{styles}}}',css);
 
fs.writeFile( filename ,html,'utf-8',(err)=>{
// 调用reload方法
browserSync.reload(indexpath);
console.log('UpdatedTime'+ new Date())});
 
});
});
});
var template = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<style> {{{styles}}} </style>
</head>
<body>
<div>
 
{{{content}}}
</div>
</body>
</html>
`;
 
流的概念
--流是程序输入或输出的一个连续的字节序列
--文件流,网络流
--设备输入输出都是用流来处理的
 
fs.createReadStream()
创建一个流的管子,将磁盘中数据与内存中的部分导通连接起来。。
// 创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务()
(线程池中的处理。。)
 
 
// 创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务()
var reader = fs.createReadStream('.\\1.iso');
reader.on('data',(chunk)=>{
//chunk是一个buffer(字节数组)
console.log('读了一点'+chunk.length);
});

//缓冲区存的就是一个字节数组

文件流的方式操作只读流

//文件的复制
const fs = require('fs');
const path = require('path');
// 创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务()
var reader = fs.createReadStream('.\\1.iso');
fs.stat('.\\1.iso',(err,stats)=>{
 
if(stats){
var readTotal = 0;
reader.on('data',(chunk)=>{
//chunk是一个buffer(字节数组)
 
console.log('读了一点.进度'+(readTotal+=chunk.length)/stats.size * 100+'%');
 
});
}
});
文件流的写入:
 

//文件的复制
const fs = require('fs');
const path = require('path');
// 创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务()
var reader = fs.createReadStream('.\\1.iso');
// 创建一个写入流
var writer = fs.createWriteStream('.\\2.iso');
fs.stat('.\\1.iso',(err,stats)=>{
 
if(stats){
var readTotal = 0;
reader.on('data',(chunk)=>{
//chunk是一个buffer(字节数组)
 
 
writer.write(chunk,(err)=>{
console.log('写了一点.进度'+(readTotal+=chunk.length)/stats.size * 100+'%');
});
 
 
});
}
});

 pipe方法 
 
//文件的复制
const fs = require('fs');
const path = require('path');
// 创建文件的读取流,并没有读出正式的数据,开始了读取文件的任务()
var reader = fs.createReadStream('.\\1.iso');
// 创建一个写入流
var writer = fs.createWriteStream('.\\2.iso');
//reader 读取流
reader.pipe(writer);
 

Socket(传输层)

 
 

 
HTTP(应用层)
//
超文本传输协议
 
 
 
浏览器的本质作用
 
1.将用户输入的URL封装为一个请求报文,
2.建立与服务器端的连接,
3.将封装好的请求报文通过socket发送到服务器端,
server.write(JSON.stringify(send));
4.接收到服务端返回的响应报文,
5.解析响应报文JSON.parse,
6.渲染内容到页面当中 console.log(msg)。
 
 
浏览器就是一个Socket客户端
 
 
请求报文: 

响应报文:

 

Node笔记(2)的更多相关文章

  1. node笔记——gulp修改静态文件的名字

    cmd小技巧: 1.换到下级或同等级目录 D: 2.换到上级目录 cd.. node 包管理器小技巧[以gulp为例] npm install --save-dev gulp gulp-concat ...

  2. Node笔记五-进程、线程

    进程 -每一个正在运行的应用程序都称之为进程 -每一个应用程序都至少有一个进程 -进程是用来给应用程序提供一个运行的环境 -进程是操作系统为应用程序分配资源的一个单位线程 -用来执行应用程序中的代码 ...

  3. Node笔记四

    异步操作 -Node采用chrome v8 引擎处理javascript脚本 --v8最大特点就是单线程运行,一次只能运行一个任务 -Node大量采用异步操作 --任务不是马上执行,而是插在任务队列的 ...

  4. Node笔记三

    global --类似与客户端javascript运行环境中的window process --用于获取当前node进程信息,一般用于获取环境变量之类的信息 console --node中内置的con ...

  5. Node笔记二

    ### 安装包的方式安装 - 安装包下载链接: + Mac OSX: [darwin](http://npm.taobao.org/mirrors/node/v5.7.0/node-v5.7.0.pk ...

  6. Node笔记一

    什么是javascript? --脚本语言 --运行在浏览器中 --一般用来做客户端页面的交互 javascript运行环境 --运行在浏览器内核中的JS引擎 浏览器这种javascript可以做什么 ...

  7. node笔记

    基础入门可参考: <一起学 Node.js>—— https://github.com/nswbmw/N-blog 核心模块使用前需要引入   let fs=require('fs'); ...

  8. node笔记汇总

    项目依赖分两种,一个就是普通的项目依赖比如bootstrap,还用一种只是开发阶段需要用的,这种属于开发依赖比如gulp,开发依赖最终记录在devDependencies节点里面 -          ...

  9. Node笔记(1)

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.  进程 1.process.argv 用于获取当前进程信息 0--node.exe的目录1--js文件的目录2 ...

  10. Node笔记 - process.cwd() 和 __dirname 的区别

    process.cwd() 返回工作目录  __dirname 返回脚本所在的目录位置 单看概念觉得都差不多,有种似懂非懂的感觉,那么接下用一个简单易懂的例子来理解下这两者的区别,在此之前先看一个方法 ...

随机推荐

  1. h264封包介绍

    这个要看你怎么理解了.和MPEG2.MPEG4相比,H.264字节流中帧的形式发生了变化.以视频帧为例,MPEG2和MPEG4字节流在传输的时候提取帧的关键参数,将其封装入传输包首部,比如TS包或RT ...

  2. 优酷土豆资深工程师:MySQL高可用之MaxScale与MHA

    本文根据DBAplus社群第67期线上分享整理而成 本次分享主要包括以下内容: 1.MySQL高可用方案 2.为什么选择MHA 3.读写分离方案的寻找以及为什么选择Maxscale 一.MySQL  ...

  3. POJ 3281(Dining-网络流拆点)[Template:网络流dinic]

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmlrZTBnb29k/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  4. 当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题

    在使用jquery的ajax进行请求发送并由服务端的servlet返回json格式的数据内容时,假设输出内容没有正确设置,会遇到client浏览器报告parse error的问题.这个问题的解决仅仅须 ...

  5. POJ 3080 Blue Jeans (后缀数组)

    题目大意: 求出这些DNA序列中的最长且字典序最小的公共子串. 思路分析: 二分长度的答案,去height中扫描这个长度是否满足,一旦满足就立即输出.这样就能够保证字典序最小了. #include & ...

  6. c++11 实现半同步半异步线程池

    感受: 随着深入学习,现代c++给我带来越来越多的惊喜- c++真的变强大了. 半同步半异步线程池: 事实上非常好理解.分为三层 同步层:通过IO复用或者其它多线程多进程等不断的将待处理事件加入到队列 ...

  7. 20. Valid Parentheses[E]有效的括号

    题目 Given a string containing just the characters '(',')','[',']','{' and '}',determine if the input ...

  8. BZOJ 1507 splay

    写完维修数列 这不是水题嘛233333 //By SiriusRen #include <cstdio> #include <cstring> #include <alg ...

  9. [Codeforces]Codeforces Round #460 (Div. 2)

    Supermarket 找最便宜的就行 Solution Perfect Number 暴力做 Solution Seat Arrangement 注意当k=1时,横着和竖着是同一种方案 Soluti ...

  10. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...