最近有好多需求是把一堆图片,或者一张长图转成HTML文件在客户端展示,所以想尝试自动化这一过程,简单实验了一个HTML5生成器。

功能:

根据文件夹中图片文件生成简单HTML5展示页面

安装

$ npm install -g html5fromImages

使用

$ html5fromImages [图片文件夹所在路径] [生成目标路径] [网页title]

$ html5fromImages ~/git/yqx/web/littlec-emsweb/app/help/sysc_fw/images/ dist-test 示例网页

参考文档

用Node.js写生成器是件非常简单的事儿,原因是

Node.js模块开发简单,js语法,而且二进制cli模块也极其简单

Npm发布包是所有开源的包管理器里最简单好用的

辅助模块多,将近40万个左右

这里精简一下,你只需要5步

初始化模块

cli二进制模块

模板引擎使用

解析cli参数和路径

npm发布

这里假定你已经安装了Node.js,至于是什么版本,如何安装的并不重要。

先要介绍一下,什么是Npm?

npm is the package manager for

browsers

javascript

nodejs

io.js

mobile

bower

docpad

test

简单理解:NPM(node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。只要安装了Node.js,它会默认安装的。

1)初始化模块

确认模块名称是否已被发布

$ npm info html5fromimages

如果没有找到对应的包,说明你可以使用这个名字,然后在github建立仓库,clone到本地即可

$ git clone html5fromimages

$ npm init -y

生成package.json文件,此文件为模块的描述文件,非常重要。

{

"name": "html5fromimages",

"version": "1.0.0",

"description": "",

"main": "index.js",

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1"

},

"keywords": [],

"author": "",

"license": "ISC"

}

说明

main是模块的入口文件,即普通代码对外提供调用的api入口。

scripts是npm scripts非常便利的,只要在package.json所在目录下,你执行npm test就会调用这里的test配置。如果是test,start等内置命令之外的,可以通过npm run xxx来定义

2)cli二进制模块

Node.js分2种模块

普通模块,供代码调用

二进制模块,提供cli调用

大家都知道,生成器是cli工具,所以我们应该使用cli二进制模块

手动修改package.json文件

{

"name": "a",

"version": "1.0.0",

"description": "",

"main": "index.js",

"bin": {

"html5fromImages": "html5fromImages.js"

},

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1"

},

"keywords": [],

"author": "",

"license": "ISC"

}

这里主要增加里一个bin的配置,bin里的html5fromImages为cli的具体命令,它具体执行的文件是html5fromImages.js。

既然html5fromImages的执行文件是html5fromImages.js,我们当然需要创建它

$ touch html5fromImages.js

填写

#!/usr/bin/env node

var argv = process.argv;

var filePath = __dirname;

var currentPath = process.cwd();

console.log(argv)

console.log(filePath)

console.log(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)html5fromImages

$ html5fromImages

[ '/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不是特别熟悉,这种思维转换是非常难受的。

这里我们选一个,目前Node.js里最火的应该也是最好的Nunjucks,我感觉它和ejs比较像,但跟jade一样强大,语法据说出自Python的某款模板引擎

$ npm install --save nunjucks

然后我们修改模板引擎

#!/usr/bin/env node

var fs = require('fs')

var nunjucks = require('nunjucks')

var tpl = fs.readFileSync(filePath +'/html5fromImages.tpl').toString()

var compiledData = nunjucks.renderString(tpl, {'items':res,'title':title});

fs.writeFileSync(distPath + '/index.html', compiledData)

console.log('----finished----');

这里我们只看nunjucks代码。

1)引入nunjucks模块

2)nunjucks.renderString方法是编译模板用的,它有2个参数

第一个是模板字符串

第二个是json数据

3)compiledData就是编译后的结果

结合上面说的模板引擎原理,

编译(模板 + 数据) => html

再理解一下,效果会更好。

创建一个html5fromImages.tpl,内容为

{{title}}

body,html {

margin:0 !important;

text-align:justify;

}

.container{

width:100%;

}

img{

width:100%;

display: block;

}

{% for item in items %}

%7B%7Bitem.filename%7D%7D

{% endfor %}

下面我们看看如何用html5fromImages.js来读取模板。

var fs = require('fs')

var nunjucks = require('nunjucks')

var tpl = fs.readFileSync('./html5fromImages.tpl').toString()

var compiledData = nunjucks.renderString(tpl, { username: 'James' });

console.log(compiledData)

1)引入fs模块,因为要读取文件

2)fs.readFileSync('./html5fromImages.tpl').toString(),使用了一个读取文件的同步方法,并把文件内容转成字符串,原来是buffer

读文件还是挺简单吧。那么写文件呢?

fs.writeFileSync('./html5fromImages.html', compiledData)

至此,一个生成器的模型就出来

#!/usr/bin/env node

var fs = require('fs')

var nunjucks = require('nunjucks')

var tpl = fs.readFileSync('./html5fromImages.tpl').toString()

var compiledData = nunjucks.renderString(tpl, {'items':res,'title':title});

console.log(compiledData)

fs.writeFileSync('./html5fromImages.html', compiledData)

思考一下,可变得有哪些?

'./html5fromImages.tpl'是输入模板

{'items':res,'title':title} 要编译的数据

'./html5fromImages.html'是最终的输出

那么,剩下的事儿就是围绕可变得内容来构造你想要的功能。

4)解析cli参数和路径

要说生成器,最经典的是rails的scaffold,曾经缔造了一个15分钟blog的神话

$ rails g book name:string coordinates:string

如果我们要实现它,怎么做呢?

rails g是固定的用于生成的命令

book是模型名称,俗称表名

而name和coordinates都是字段名称,string是表中的类型

可变的只有表名和字段信息。所以只要解析到这些就够了,换成我们的gen命令,大概是这样

$ gen book name:string coordinates:string

html5fromImages.js代码

#!/usr/bin/env node

var argv = process.argv;

console.log(argv)

执行gen命令的结果是

$ gen book name:string coordinates:string

[ '/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' ]

这时候,可以再仔细看看我们html5fromImages.js的代码

读写文件使用 fs

复制文件夹使用child_process shell命令

对文件名排序 Array.sort( [ sortFunction ] ) 比较其中数字大小

process.argv 获取输入变量 从第3位开始

排除隐藏文件等 判断是否为图片文件

#!/usr/bin/env node

var fs = require('fs')

var nunjucks = require('nunjucks')

var child_process = require('child_process')

//复制文件夹

function copyDir(src, dist) {

child_process.spawn('cp', ['-rf', src, dist]);

}

//根据数字比较文件名

function sortNumber(a,b)

{

var first = a.filename.replace(/[^\d]/g, '')

var secend = b.filename.replace(/[^\d]/g, '')

return first - secend;

}

//判断是否为图片文件

function checkImageFile(file){

if( file.substring(file.indexOf('.')) =='.png' ||

file.substring(file.indexOf('.')) =='.PNG' ){

return true;

}

return false;

}

var filePath = __dirname;

var currentPath = process.cwd();

var imagesPath = process.argv[2] ? process.argv[2] : currentPath;

var distPath = process.argv[3] ? process.argv[3] : currentPath + '/dist-' + Date.now();

var title = process.argv[4] ? process.argv[4] :'';

console.log(filePath);

console.log(currentPath);

console.log('图片所在路径:' + imagesPath);

console.log('生成文件路径:' + distPath);

var res=[],html = '', files = fs.readdirSync(imagesPath);

if(!fs.existsSync(distPath)){

//rmDir(distPath);

fs.mkdirSync(distPath);

}

files.forEach(function(file){

var filename = file

, stat = fs.lstatSync( imagesPath + '/'+filename);

if (!stat.isDirectory() && checkImageFile(filename) ){

res.push({'filename':filename});

}

});

res.sort(sortNumber);

var tpl = fs.readFileSync(filePath +'/html5fromImages.tpl').toString()

var compiledData = nunjucks.renderString(tpl, {'items':res,'title':title});

fs.writeFileSync(distPath + '/index.html', compiledData)

copyDir(imagesPath ,distPath+ '/images');

console.log('----finished----');

至此,完成了所有代码。此时你在任意目录输入

$ html5fromImages [图片文件夹所在路径] [生成目标路径] [网页title]

$ html5fromImages ~/git/yqx/web/littlec-emsweb/app/help/sysc_fw/images/ dist-test 示例网页

你会发现目标路径下会有一个html5fromImages.html文件,和images文件夹。

5)npm发布

在package.json目录里执行

$ npm publish .

就可以了发布成功了。

如果你想增加版本号,再次发布,你需要2步

$ npm version patch

$ npm publish .

你可以自己测试一下

$ npm i -g xxxxxx

发布时遇到的问题

重置为官方镜像

$ npm config set registry http://registry.npmjs.org/

然后 按照提示 注册 adduser 登陆 再publish 就能够成功

2. 注意npm的模块名不能有大写字母

通过

$ npm install -g html5fromImages

就可以使用了

更多

整体来说,还是一个非常实用的模块,而且比较简单,适合入门。

目前只是基础版本,有待进一步完善优化

异常:各种可能的异常捕获及处理

测试:

工具模块:比如使用debug模块处理调试信息,日志等

argv解析模块:commander 或者yargs

实用工具,比如各种大小写转换,驼峰式

最后

可以开始尝试写我们自己的项目生成器啦。

html5 nodejs桌面开发工具,html5fromImages-nodejs生成器入门相关推荐

  1. 12款免费HTML5开发框架和开发工具…

    HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的Web开发人员使用HTML5.HTML5有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用 ...

  2. 5个好用的html5混合式App开发工具推荐

    近几年html5技术在各大平台都是人们谈论的焦点.html5技术一直受到各方关注,"html5颠覆原生 App"的争论也从未停止过,不管怎样html5生态的构建方兴未艾.不过对于移 ...

  3. Nodejs的开发工具Nide的安装过程

    <!--[if !supportLists]-->1.      <!--[endif]-->ubuntu下安装nodejs sudo apt-get install pyth ...

  4. html在线编程工具,6 个强大的 HTML5 应用在线开发工具

    HTML5 日渐成为 Web 开发的主流技术之一,目前,W3C 已经完成了 HTML5 的基本特性,HTML5 成为 W3C 官方标准指日可待. 目前互联网中已经出现了大量基于 HTML5 的应用,其 ...

  5. html5 移动端 开发工具,H5推荐:最好用的五大移动应用开发工具

    移动互联网的开放性带给草根创业者许多想象,"有为青年.白手起家.90后创业",成为这个时代最值得骄傲的字眼.打工不易,创业更不易,开发者不仅要面对专业技术.创新思维.市场推广的考验 ...

  6. html5 java web开发工具_HTML5 WYSIWYG Editor:Aloha Editor

    相关开源项目 GQuery:GQuery是"克隆"jQuery API的一个开源项目.GQuery不是在jQuery的基础上进行封装,而是完全采用GWT1.5新特性实现.可以利用该 ...

  7. html5 mac os 开发工具,如何通过TextMate或命令行在Mac OS上使用W3C tidy-html5软件包?...

    我在这里安装了W3C整洁,HTML5束: 〜/库/ Application Support /禽/原始副本/捆绑/整齐-HTML5如何通过TextMate或命令行在Mac OS上使用W3C tidy- ...

  8. HTML5 Web app开发工具Kendo UI Web中图像浏览器的使用

    2019独角兽企业重金招聘Python工程师标准>>> Kendo UI Web中的图像浏览器在默认的情况下会打开一个简单的对话框,如下图所示,方便用户键入或者是粘贴图片的URL以及 ...

  9. HTML5 Web app开发工具Kendo UI Web中Grid网格控件的使用

    Kendo UI Web中的Grid控件不仅可以显示数据,并对数据提供了丰富的支持,包括分页.排序.分组.选择等,同时还有着大量的配置选项.使用Kendo DataSource组件,可以绑定到本地的J ...

最新文章

  1. GraphQL 配合 JWT 使用 —— Laravel RSS (二)
  2. From 《visual C++ 6.0开发工具与调试》
  3. sqlserver2008 安装时需要重启的解决办法
  4. [vue] DOM渲染在哪个周期中就已经完成了?
  5. 【codevs2399】【BZOJ2753】滑雪与时间胶囊,bfs+最小生成树
  6. EXCEL如何新建自定义单元格以及样式怎么设置
  7. PDF怎样免费转换成word?无须借助软件,网页就能轻松实现。
  8. C语言编程练习---2021级山东理工大学ACM实验三题解
  9. Keil RTX 系统函数 定义
  10. Clouda安装和使用过程详解
  11. antd里面select组件mode为tags时,输入重复按回车键做保留处理
  12. 怎样使用NetFlow分析网络异常流量
  13. 微信公众号的类型和功能
  14. 固定table第一列
  15. Linux 命令积累(当作笔记)
  16. 电视机接口中英文介绍
  17. 农业产业化发展趋势下人力资源管理浅析
  18. 【论文摘要】基于多数投票模式和超混沌加密的彩色图像鲁棒安全零水印算法
  19. Spring Security安全机制
  20. WordPress修改默认邮箱、用户名(图解)

热门文章

  1. ajax框架怎么学,Ajax框架之DWR学习(文件上传案例)
  2. 缠论123买卖点主图公式_缠论主图指标的正确应用方式
  3. linux中sed或awk,Linux中sed和awk命令比较实例
  4. 怎样查一个文件被复制了几次_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
  5. linux make指定目标平台,CMake on Linux:目标平台不支持动态链接
  6. wetool个人版_个人版wetool -公众号
  7. 数据结构专题二:2.6链表删除结点
  8. 华硕z97不识别m2固态_固态盘M.2、SATA有这样的差别,难怪大家都选“它”
  9. 计算方法c语言上机作业,考研复试-----C语言上机操作(三)
  10. 基于鸿蒙操作系统移植,基于鸿蒙OS的按键驱动