谁能教我装上fen器

【零基础十分钟】教你用Node.js写生成器:你只需要5步
用Node.js写生成器是件非常简单的事儿,原因是
Node.js模块开发简单,js语法,而且二进制cli模块也极其简单
Npm发布包是所有开源的包管理器里最简单好用的
辅助模块多,将近40万个左右
所以为了让大家零基础十分钟搞定生成器,这里精简一下,你只需要5步
初始化模块
cli二进制模块
模板引擎使用
解析cli参数和路径
这里假定你已经安装了Node.js,至于是什么版本,如何安装的并不重要。
先要介绍一下,什么是Npm?
npm is the package manager for
简单理解:NPM(node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。只要安装了Node.js,它会默认安装的。
它可不只是Node.js package manager,可见其定位是很广的,这从侧面也佐证了大前端和node全栈的机会。以前nodejs吹牛都是那异步说事儿,现在都是拿生态说事儿,这话不错,在09年谈异步,很多语言性能都很弱,但事情要以发展的眼光看,现在很多语言都支持了,而且性能还不错,所以才显得nodejs性能没那么突出。
无论做哪方面工作都可以使用npm,所以使用Node.js来开发各种模块都是非常方便的。
1)初始化模块
确认模块名称
$ npm info xxxxxx
如果没有找到对应的包,说明你可以使用这个名字,然后在github建立仓库,clone到本地即可
$ git clone xxx$ npm init
生成package.json文件,此文件为模块的描述文件,非常重要。
"index.js"
"echo "Error: no test specified" && exit 1"
"keywords"
main是模块的入口文件,即普通代码对外提供调用的api入口。
s是npm s非常便利的,只要在package.json所在目录下,你执行npm test就会调用这里的test配置。如果是test,start等内置命令之外的,可以通过npm run xxx来定义
2)cli二进制模块
Node.js分2种模块
普通模块,供代码调用
二进制模块,提供cli调用
大家都知道,生成器是cli工具,所以我们应该使用cli二进制模块
手动修改package.json文件
"index.js"
"echo "Error: no test specified" && exit 1"
"keywords"
这里主要增加里一个bin的配置,bin里的gen为cli的具体命令,它的具体执行的文件gen.js,大家看到这是一个plain old object类型,所以可以配置多个命令的,各位可以按照自己的喜好来。
既然gen的执行文件是gen.js,我们当然需要创建创建它
$ touch gen
#!/usr/bin/env node
currentPath
currentPath
argv是命令行的参数
filePath是当前文件的路径,也就是以后安装后文件的路径,用于存放模板文件非常好
currentPath是当前shell上下文路径,也就是生成器要生成文件的目标位置
至此,二进制模块的代码就写完了,下面我们测一下
(1)本地安装此模块
在package.json文件路径下,执行
$ npm link/Users/sang/.nvm/versions/node/v4.4.5/bin/gen -&/Users/sang/.nvm/versions/node/v4.4.5/lib/node_modules/a/gen.js/Users/sang/.nvm/versions/node/v4.4.5/lib/node_modules/a -&/Users/sang/workspace/github/i5ting/a
此时说明已经安装成功了。
(2)执行gen测试
$ gen['/Users/sang/.nvm/versions/node/v4.4.5/bin/node','/Users/sang/.nvm/versions/node/v4.4.5/bin/gen']/Users/sang/workspace/github/i5ting/a/Users/sang/workspace/github/i5ting/a
可以换不同的目录来测试一下,看看结果的不同,来体会上面3个变量的妙用。
3)模板引擎使用
模板引擎是一种复用思想,通过定义模板,用的时候和数据一起编译,生成html,以便浏览器渲染。从这个定义里我们可以找出几个关键点
编译(模板 + 数据) =& html
模板引擎有好多种,下面介绍2种典型的模板引擎
ejs:嵌入js语法的模板引擎(e = embed),类似于jsp,asp,erb的,在html里嵌入模板特性,如果熟悉html写起来就非常简单,只要区分哪些地方是可变,哪些地方是不变即可
jade:缩进式极简写法的模板引擎,发展历史 HAML -& Jade -& Slim -& Slm,最早是ruby里有的,目前以jade用的最多,这种写法虽好,,但需要大脑去转换,这其实是比较麻烦的,如果对html不是特别熟悉,这种思维转换是非常难受的。
更多见 /tj/consolidate.js#supported-template-engines
这里我们选一个,目前Node.js里最火的应该也是最好的Nunjucks,我感觉它和ejs比较像,但跟jade一样强大,语法据说出自Python的某款模板引擎
$ npm install
save nunjucks
然后我们修改模板引擎
#!/usr/bin/env node
// var argv = process.
// var filePath = __
// var currentPath = process.cwd();
// console.log(argv)
// console.log(filePath)
// console.log(currentPath)
'nunjucks'
compiledData
renderString
'Hello {{ username }}'
compiledData
注释一下前面说的3个变量,这里我们只看nunjucks代码。这是最简单的demo。
(1)引入nunjucks模块
(2)nunjucks.renderString方法是编译模板用的,它有2个参数
第一个是模板字符串
第二个是json数据
(3)compiledData就是编译后的结果
结合上面说的模板引擎原理,
编译(模板 + 数据) =& html
再理解一下,效果会更好。
但是这样看来对我们没啥用啊,生成器的内容总不能都写到字符串里吧?所以继续改造,把模板独立出去,然后通过文件读写来获取模板字符串。
创建一个gen.tpl,内容为Hello {{ username }},下面我们看看如何修改gen.js来读取模板。
)varnunjucks =require('nunjucks')vartpl =fs.readFileSync('./gen.tpl').toString()varcompiledData =nunjucks.renderString(tpl,{username:'James'});console.log(compiledData)
(1)引入fs模块,因为要读取文件
(2)fs.readFileSync(’./gen.tpl’).toString(),使用了一个读取文件的同步方法,并把文件内容转成字符串,原来是buffer
读文件还是挺简单吧。那么写文件呢?
writeFileSync
'./gen.xxx'
compiledData
至此,一个生成器的模型就出来
#!/usr/bin/env node
'nunjucks'
readFileSync
'./gen.tpl'
compiledData
renderString
compiledData
writeFileSync
'./gen.xxx'
compiledData
思考一下,可变得有哪些?
'./gen.tpl’是输入模板
{ username: ‘James’ } 要编译的数据
'./gen.xxx’是最终的输出
那么,剩下的事儿就是围绕可变得内容来构造你想要的功能。
4)解析cli参数和路径
要说生成器,最经典的是rails的scaffold,曾经缔造了一个15分钟blog的神话
$ rails g book name
coordinates
如果我们要实现它,怎么做呢?
rails g是固定的用于生成的命令
book是模型名称,俗称表名
而name和coordinates都是字段名称,string是表中的类型
可变的只有表名和字段信息。所以只要解析到这些就够了,换成我们的gen命令,大概是这样
$ gen book name
coordinates
修改gen.js代码
#!/usr/bin/env node
执行gen命令的结果是
$ gen book name
coordinates
['/Users/sang/.nvm/versions/node/v4.4.5/bin/node','/Users/sang/.nvm/versions/node/v4.4.5/bin/gen','book','name:string','coordinates:string']
下面构造一个entity对象
()argv.shift()console.log(argv)vardata ={model:argv[0],attr:{}}for(vari =1;i &argv.length;i++){vararr =argv[i].split(':')vark =arr[0];varv =arr[1];data.attr[k]=v}console.dir(data)
$ gen book name
coordinates
string['book','name:string','coordinates:string']data ={model:'book',attr:{name:'string',coordinates:'string'}}
那这里的data可以做什么呢?想想模板引擎里的第二个参数~
// tpl compilevarcompiledData =nunjucks.renderString(tpl,data)
修改模板gen.tpl
error {%endfor %}}
结果gen.xxx为
coordinates
这里是只是示意,具体当按照你想要的结果为准。
#!/usr/bin/env node
'nunjucks'
// var filePath = __
// var currentPath = process.cwd();
// console.log(filePath)
// console.log(currentPath)
// cli parse
// read tpl
readFileSync
'./gen.tpl'
// tpl compile
compiledData
renderString
compiledData
// write file
writeFileSync
'./gen.xxx'
compiledData
下面修改一下路径
tpl从__dirname走
而结果需要写到process.cwd()
也就是我们前面说的那2个没有用到的变量filePath和currentPath。
#!/usr/bin/env node
'nunjucks'
currentPath
// console.log(filePath)
// console.log(currentPath)
// cli parse
// read tpl
readFileSync
'/gen.tpl'
// tpl compile
compiledData
renderString
compiledData
// write file
writeFileSync
currentPath
'/gen.xxx'
compiledData
至此,完成了所有代码。此时你在任意目录输入
$ gen book name
coordinates
你会发现当前目录下会有一个gen.xxx文件,和我们之前看到的结果一样。
5)npm发布
在package.json目录里执行
$ npm publish
就可以了发布成功了。
如果你想增加版本号,再次发布,你需要2步
$ npm version patch$ npm publish
你可以自己测试一下
share给别人吧
异常:各种可能考虑到并处理
测试:按照各位喜好 mocha, ava, jest
工具模块:比如使用debug模块处理调试信息,日志等
argv解析模块:commander 或者yargs
实用工具,比如各种大小写转换,驼峰式等 inflected
生成器理论是可以生成一切内容的,那么生成能够生成器模板代码么?自己想想吧
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点大神教你分分钟就能学会的撩妹小魔术:纸牌读心术-小知识视频-搜狐视频
大神教你分分钟就能学会的撩妹小魔术:纸牌读心术
视频介绍:
纸牌读心术这个小魔术你会吗?说不定还可以撩妹哦,赶紧来看看吧!
推荐出品人扫码下载极果客户端
器材心得小分享|5 分钟教会你 GoPro 花样玩法
在远方的阿伦
在远方的阿伦,用自己的方式“去远方”。2015年单人环游中国21000公里,自驾冒险还在继续。
开篇小黑板1:本期本来是想给大家分享使用DJI无人机的心得体会的,不料视频刚剪辑到一半,咻的一声,秋菊变胎菊.....寡人的藏经殿(那块大的硬盘)崩了,单人单车21000公里环游中国的全部图片视频都在里面....(小的那块是寡人的藏娇殿),目前正在全力抢救藏娇殿中......2:所以本期我先分享一下GoPro的使用心得,让我先拯救一下硬盘3:本期凡是很浪的图片均采用GoPro拍摄,snapseed手机调色不BB了小喇嘛倒咖啡看过游记或者是下面这张影像器材列表的朋友们都知道,我在出行时的器材选择上完全是偏重于比较轻巧便携的摄影装备,这也比较符合我的个人习惯。(因为我不做商拍,只是记录旅程上的风景而已)所以轻巧便携的GoPro运动相机就毫无悬念的进入了我的购买清单。放图时间就成像画质而言,使用下来我自己的体会是,成像在手机之上单反之下,跟无人机的画质持平(但拍照和视频上的功能要强不少),但其实已经足够我日常使用了。............路上视频是怎么拍的?一个人嘛不是......GoPro有个优点,同时也是它的缺点,就是配件实在是太丰富,而且很多都是超级便宜,你可以通过配件把他固定在不同地方进行拍摄;但就是由于配件出奇的多,买一堆回来也可能不知道哪种配件用在哪里比较合适。那我就从画面的角度讲配件吧:)1:车外风景的固定画面例如我刚到门源时拍的这个小片段,就是使用了下面配件,通过它们来将GoPro固定到车顶或者后挡风玻璃上。— 正确的配件使用姿势 — 吸盘组件也是GoPro最灵活的配件了!网上搜搜,超级便宜。2:车内风景的固定画面这是我离开上海出发前往远方时的街景,光怪陆离,现在想来还是如梦一场。— 正确的配件使用姿势 — 其实就是在刚才的组合上加上一个三向转向臂,将平底粘附固定底座及螺钉 + 三向转向臂 + 车内吸盘的组合,上图是固定在后排主驾驶一侧后方玻璃上的,使用Gopro延时摄影的功能。3:三脚架固定延时画面确定自己熟练掌握上述技能,想要晋升大神的同学们可以来挑战下延时摄影,当然前提是,做好三小时风吹日晒/蚊虫叮咬/人生三急的心理准备。— 正确的配件使用姿势 — 准备好三脚架 + 三脚架转接头+脚架自带的快拆板,具体姿势已经洗好等你了。4:溜达爬山画面好吧,我承认我标题党了,其实我想说的是,如果你想要给人第一视角的代入感,让人走你走过的路,感受你一路上的二逼、艰辛、惊吓等等,比如这样~或者这样— 正确的配件使用姿势 — 你只需要将 GoPro 用固定夹夹在背包的肩带上,或者配一个胸带就能把所经之路从不靠谱的记忆中 copy 下来,永远储存在点击就能查看的地方。5:自拍杆必须的光拍风景牛羊也会腻,路人妹纸也不是时常有,既然影像工具的作用是记录周围的一切,何不厚着脸皮记录下当时的自己?颜值不高影响环境?没关系,寡人不露脸啊!哇哈哈哈哈....人们都说,“上帝给你关上一扇门的时候,一定会为你打开一扇窗。”虽然我长得是彦祖的反面,但我发现了自拍秘笈——嘿嘿,你说对了,就是没有脸!就只让我在山河里留下个小小的身影吧。— 正确的配件使用姿势 — 还记得花样拍天篇章里的隔窗街景用到的组合么?相同组合固定在车里的合适位置,也可以加上自拍杆自由伸展,就能拥有以上高逼格自拍照啦!6:迷之背影很多朋友都在问,你是怎么拍的......其实很简单,首先你需要将一个曲面底座粘到背包上(硬塑料处),然后卡上J型底座就OK了。— 正确的配件使用姿势 — 最后祝各位在今年的摄影技术晋升大神当然首先你要有个 GoPro!最后炫耀一下我最新的GoPro Hero5 ,有了很多新功能。一直申请不到试用产品?可能是极果君对你还不了解!上传原创内容,可增加试用机会,点这里:

我要回帖

更多关于 什么什么粉 的文章

 

随机推荐