如今前端圈子框架繁多,不乏一些自主研发或合做开发的公司内部框架,模块/组件化、框架设计理念、架构分析、底层封装等去搭建高楼大厦的骨架,为的就是“维护、复用、二次开发、高效”等理念,浓缩就是两字好用(toulan)css
公司内部研发的框架体系通常都会趋向于图形化、可视化,不过大多数都会作到最后一步,那就是模块化的选择了该结构,该样式(皮肤)而后想去一键生成这个项目的时候,啊?没这个功能,实现不了,npm/cnpm的一堆依赖结构不是我想要的!那这篇文章就是来解救你了,让咱们来打造属于本身的项目结构文件依赖(是时候解放你的双手了)。html
如下技术实现是基于js、node以及自带的fs模块前端
一、win+r输入cmd回车 二、cd进入到该项目目录(想一建生成目录的地方) 三、node如何安装自行百度node
打开你善用的编辑器直接复制如下代码git
var fs = require("fs") var mkDir = ['css', 'fonts', 'img', 'module'] /* 建立目录 */ for (var i = 0; i < mkDir.length; i++) { fs.mkdir(mkDir[i], function (err) { if (err) { return console.error(err); } }) } 复制代码
ctrl+s保存,在cmd中输入github
node servernpm
回头看一下你的项目结构吧。 若是不出意外的话,项目结构已经变成了这样api
这里不得不佩服fs的强大,如下附上node fs API地址。数组
http://nodejs.cn/api/fs.html浏览器
上面已经出现了咱们想要的项目结构,不过这需求对咱们来讲还远远不足,咱们还须要建立js文件以及html文件之类呢。
里面写书写如下代码:
复制代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Hello World!</h1> </body> </html> 复制代码
var fs = require("fs") /* 读取index.html文件建立indexx.html文件 */ fs.readFile('index.html', 'utf8', function (err, data) { if (err) { return console.error(err); } fs.appendFile('indexx.html', data, 'utf8', function (err) { if (err) { return console.error(err); } }); }); 复制代码
cmd执行
node server
回头看下项目目录,是否多了个indexx.html的文件,若是多了就说明成功了,以上的操做是读取了index.html内的全部文本内容,而后建立了indexx.html的超文本,固然对fs来讲,只是修改了后缀名而已。
Tips:如下步骤会分步介绍各个阶段的执行过程(最下方含有完整的github项目地址)
复制代码
var _methods = { data: { /*数据存放位置*/ now: 0, /*当前进程计数*/ sum: 0, /*一共进程次数*/ log: '' /*输出的tree*/ }, _nodeInit: function (mkDir) { /*初始化*/ this._nodeSum(mkDir) /*先得出一共须要的执行次数,以便去判断异步回来的当前次数*/ this._nodeFor(mkDir) /*进入下个流程 --- 建立*/ }, _nodeFor: function (mkDir) { /*建立*/ /*这儿是执行目录结构建立的地方 而且每次异步回调后执行 this._nodeTree(++now) 以便去显示当前建立进度*/ }, _nodeSum: function () { /*计算一共的建立次数*/ /*为何要先获取总共的建立次数, 由于fs的函数建立是异步的, 过程当中很难判断所有异步是否已经完成 而且tree的建立也是在这执行的 输出给this.tree以及this.sum*/ }, _nodeTree: function () { /*当前进度判断*/ /*若是当前进度===总进度时 则执行以前就已经建立好了的 去console.log(this.tree)出来*/ } } var fs = require("fs") /*引入fs*/ var mkDir = [ /*项目结构树一览*/ { name: 'csss', /*文件夹名称*/ child: [ { name: 'public.css', /*文件名称*/ val: '' /*文件内容*/ }, { name: 'asd', child: [ { name: 'asd' } ] } ] } ] _methods._nodeInit(mkDir) 复制代码
一、_nodeSum: 多线程异步的状况下,没能很好得知是否所有执行完成,因此采用了该方式(定时器不可取)
二、_nodeTree: 树结构console.log并非很完美
复制代码
_nodeFor: function (mkDir, path) { var self = this for (var i = 0; i < mkDir.length; i++) { var name = mkDir[i].name var child = mkDir[i].child var path_block = path ? (path + '/' + name) : name if (name.lastIndexOf('.') === -1) { /*判断文件or文件夹 --- 文件夹*/ (function (path, child, name) { /*防止异步回调后变量被污染*/ fs.mkdir(path, function (err) { if (err) { return console.error(err) } self._nodeTree(++self.data.now, path, name) /*加载loading*/ if (child) { self._nodeFor(child, path) /*递归*/ } }) })(path_block, child, name) } else { /*文件*/ (function (path, val, name) { fs.appendFile(path_block, val ? val : '', 'utf8', function (err) { if (err) { return console.error(err) } self._nodeTree(++self.data.now, path, name) /*加载loading*/ }) })(path_block, mkDir[i].val, name) } } } 复制代码
这段代码并非很难理解,但调试起来确实是费劲,毕竟含有递归+异步的40行复杂代码谁也不能保证一次就能写成功,在node下,不管是debugger仍是console.log()在cmd中调试都很难受,这儿推荐个强大的node-debug调试环境,让你在喜欢的谷歌下调试
node-inspector
复制代码
调试工具(基于npm安装):node-inspector
执行流程:
一、安装 node-inspector
npm install node-inspector -g
二、监听端口(执行)
node-inspector
三、cmd到你的目录下执行node debug模式
node --debug-brk server.js
四、打开谷歌浏览器,在地址栏输入以上显示的地址:http://127.0.0.1:8080/debug?port=5858 就能够进行调试了,成功后会到如下页面,按F8便可执行到你打断点处,若是没打则直接结束。(若是不行请刷新下)
console.log('\x1B[90m' + 'Downloading Current JS to ' + __dirname + '\x1B[39m') var self = this function count (mkDir, j) { /*i为次数, j为层级*/ for (var i = 0; i < mkDir.length; i++) { (function (mkDir, i, j) { var log = log_j(j) var name = mkDir[i].name.lastIndexOf('.') === -1 ? mkDir[i].name : ('\x1B[90m' + mkDir[i].name + '\x1B[39m') self.data.log += log + '--' + name + '\n' if (mkDir[i].child) { count(mkDir[i].child, ++j) } self.data.sum++ })(mkDir, i, j ? j : 0) } } function log_j (val) { var log = '' if (val === 0) return '|' for (var i = 0; i < val; i++) { log += ' ' + '|' } return '|' + log } count(arr) console.log('\x1B[90m' + 'Altogether contains ' + this.data.sum + 'second Execution process' + '\x1B[90m') 复制代码
这儿是在异步执行_nodeFor以前就先预解析完了树结构以及总共的执行次数,由于是同步递归思想,只要注意做用域以及避免变量污染便可。
那就是以前提过的,没有一个好的方法能够监听到多线程异步的回调是否所有执行完成,若是有的话请在下方评论而且没有很好看的输出树结构,仍然有些瑕疵。
让你的console.log色彩缤纷
复制代码
这儿有两种,一种是node上的写法,一种是日常网页调试的写法(二者不一样)
一、node写法
console.log('\x1B[90m' + 'Hello, Do you think my color has changed?' + '\x1B[39m')
复制代码
/* 颜色参考值 */ 'bold' : ['\x1B[1m', '\x1B[22m'], 'italic' : ['\x1B[3m', '\x1B[23m'], 'underline' : ['\x1B[4m', '\x1B[24m'], 'inverse' : ['\x1B[7m', '\x1B[27m'], 'strikethrough' : ['\x1B[9m', '\x1B[29m'], 'white' : ['\x1B[37m', '\x1B[39m'], 'grey' : ['\x1B[90m', '\x1B[39m'], 'black' : ['\x1B[30m', '\x1B[39m'], 'blue' : ['\x1B[34m', '\x1B[39m'], 'cyan' : ['\x1B[36m', '\x1B[39m'], 'green' : ['\x1B[32m', '\x1B[39m'], 'magenta' : ['\x1B[35m', '\x1B[39m'], 'red' : ['\x1B[31m', '\x1B[39m'], 'yellow' : ['\x1B[33m', '\x1B[39m'], 'whiteBG' : ['\x1B[47m', '\x1B[49m'], 'greyBG' : ['\x1B[49;5;8m', '\x1B[49m'], 'blackBG' : ['\x1B[40m', '\x1B[49m'], 'blueBG' : ['\x1B[44m', '\x1B[49m'], 'cyanBG' : ['\x1B[46m', '\x1B[49m'], 'greenBG' : ['\x1B[42m', '\x1B[49m'], 'magentaBG' : ['\x1B[45m', '\x1B[49m'], 'redBG' : ['\x1B[41m', '\x1B[49m'], 'yellowBG' : ['\x1B[43m', '\x1B[49m'] 复制代码
二、Web端调试写法
console.log("%cHello, Do you think my color has changed?", "color: green")
复制代码
这个一看就懂了。
_nodeTree: function (now, path, name) { /*异步过程界面化*/ console.log('[' + now + '/' + this.data.sum + ']\x1B[90m ' + name + '\x1B[39m' + '\x1B[32m' + ' installed ' + '\x1B[39m' + 'at ' + path) if (now === this.data.sum) { /*当当前进度 === sum时*/ console.log('\x1B[32m' + 'All package installed ' + this.data.sum + ' project installed from ' + __dirname + '\x1B[39m') console.log('\x1B[35m' + 'Project catalogue:' + '\x1B[39m') console.log(this.data.log + '------------------------------------') console.log(",'''╭⌒╮⌒╮.',''',,',.'',,','',.\n" + " ╱◥██◣''o',''',,',.''.'',,',.\n" + "|田|田田│ '',,',.',''',,',.''\n" + "╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬" + '\n------------------------------------') console.log('\x1B[35m' + 'MAKE:o︻そ╆OVE▅▅▅▆▇◤\nBLOG:http://blog.csdn.net/mcky_love\nGITHUB:https://github.com/gs3170981' + '\x1B[39m') } } 复制代码
这儿执行的就是实时显示当前进度以及所有执行完成后的tree与我我的的信息(#^.^#)
复制代码
实时当前进度:
结束后的tree
与我的信息
/*------------------------注意事项------------------------ 一、文件夹名称不可相同、文件名称相同的状况下后缀名不可相同 二、文件夹内方可建立child子项目目录,文件下建立child对象不执行 三、文件夹名称不可包含'.'字符 ----------------------------END--------------------------*/ var mkDir = [ { name: 'csss', child: [ { name: 'public.css', val: 'body{font-size: 12px;}' }, { name: 'publicccc', child: [ { name: 'asd' } ] } ] }, { // ...... } ] 复制代码
通俗易懂的格式,不过如注意事项所说,这儿并无对‘.’下建立文件夹与不执行的地方进行try提示,须要的朋友可自行git修改。
github:https://github.com/gs3170981/cnpmDIY(好用的话记得加星哦!)
##关于
make:o︻そ╆OVE▅▅▅▆▇◤(清一色天空)
blog:http://blog.csdn.net/mcky_love
自定义项目结构与自定义的框架完美契合,适用于可视化开发,模块化合做开发,单人项目开发,多人维护等,这儿就不科普具体用处了,fs帮咱们解决了大多数问题,剩下的用途仅限制于你的脑洞!