在整一个叫 rain-boots 的Nodejs脚本工具, 大家给点意见
在整一个叫 rain-boots 的Nodejs脚本工具, 大家给点意见
呃, 貌似一直用 CoffeeScript 语法是有点小众… 模块是 JS 的, 这个先不影响
我平常喜欢用 CoffeeScript, Jade, Stylus 来做各种静态网页模型玩 渐渐摸索到一点规律吧, 觉得用代码在网页上涂涂改改挺有意思的 渐渐的这套方法觉得依赖性比较大了, 最近写东西都会犯到这个问题, 就专门对付下
因为我用的代码都是要经过编译的, 编译的步骤就有点繁琐
我的 HTML 是用 Nginx 跑的, 相对来说没有自己写服务器 Serve 的麻烦
另一点是我用了一个 doodle
命令来实现网页保存时自动刷新
这样我涂改网页的时候, 很方便在另一个电脑上看运行效果, 刚开始听有意思的
接着我发现命令多了, 更方便写在的配置文件里的, 于是尝试了 Bash 脚本
结果脚本命令有阻塞, 用 &
放在后台执行又存在 kill
的麻烦
后来就开始用 Node 脚本来跑命令, 关闭方便多了, 只是配置文件不好…
中间尝试了 Grunt, 结果每次本地安装模块, 又不能直接跑进程, 好麻烦
于是就开始想自己的方案了, 用 Node 脚本来直接将几个动作串联起来
我现在的做法是让每个插件 exports
出来一个 EventEmitter
的实例,
通过 emit
和 on
处理事件来关联不同的插件, 讲插件组合使用…
项目叫 Rain-boots, 放在 Github 上… 技术上是很简单没错…
Rain-boots 模块本身暴露的 require("rain-boots").rain
是个全局的 EventEmitter
.boots
则是一些常用函数的集合, 现在还很粗糙…
每一个插件可以暴露自己的 .rain
和 .boots
给外界, 来进行事件的传递
我自己的想法是在 Cakefile
文件里对这些事件进行组合搭配
尝试弄了个编译 coffee 的插件, 最后用的时候就像这样
coffee = require("coffee-boots").rain;
coffee.emit ("watch", {
from: "a.coffee"
to: "a.js"
});
然后检测到 a.coffee
的 change
事件就重新编译一次.
先打算完成一个自己基本需求能用的… 然后考虑下能不能方便别人用
在整一个叫 rain-boots 的Nodejs脚本工具, 大家给点意见
背景介绍
最近我在尝试用 Node.js 来简化一些日常开发任务,比如编译 CoffeeScript、Jade 模板和 Stylus 样式表。由于这些任务通常需要多次编译和调试,我希望能有一个更高效的方式来管理这些过程。
使用现状
目前,我主要用以下几种技术来处理这些任务:
- CoffeeScript:我喜欢用 CoffeeScript 来编写更简洁的 JavaScript 代码。
- Jade:用于编写简洁的 HTML 模板。
- Stylus:用于编写更灵活的 CSS 样式表。
这些代码都需要经过编译才能在浏览器中运行。编译过程有些繁琐,但幸好我用 Nginx 来托管 HTML 页面,这避免了自己写服务器的麻烦。
工具选择
为了简化这些任务,我尝试过多种方法,包括 Bash 脚本和 Grunt。但发现 Bash 脚本有阻塞问题,而 Grunt 需要频繁地安装模块且不便于直接运行。
我的解决方案
于是,我决定用 Node.js 来实现一个更灵活的脚本工具。这个工具就是我正在开发的 rain-boots
。
rain-boots
介绍
rain-boots
是一个基于 Node.js 的脚本工具,旨在简化常见的开发任务。它通过事件驱动的方式将多个任务串联起来。
示例代码
下面是一个简单的示例,展示如何使用 rain-boots
来编译 CoffeeScript 文件:
// 引入 coffee-boots 插件
const coffee = require("coffee-boots").rain;
// 监听 CoffeeScript 文件的变化
coffee.on('change', (event) => {
if (event.from === 'a.coffee') {
console.log(`Detected change in ${event.from}, compiling...`);
coffee.emit('compile', { from: event.from, to: 'a.js' });
}
});
// 手动触发编译任务
coffee.emit('watch', { from: 'a.coffee', to: 'a.js' });
实现细节
- 事件驱动:每个插件都暴露一个
EventEmitter
实例,通过emit
和on
方法来处理事件。 - 组合插件:插件可以组合使用,通过事件来传递信息。
- 配置文件:可以在
Cakefile
文件中定义这些事件的组合逻辑。
未来计划
目前,我主要集中在实现我自己所需的最基本的功能。接下来,我会考虑如何使这个工具更加通用,以便其他开发者也能方便地使用。
总结
如果你有任何建议或反馈,请告诉我!我很乐意听到大家的意见,以便进一步改进这个工具。
支持。这个任务的设置最好能从一个setting文件里读。能检测setting文件并更新,就是eat your own dog food 了 :)
现在的想法是常用功能也做成一个插件, 最后在脚本里两行代码引用
检测 Setting 文件的更新这个我没想过, 似乎用 Cakefile
处理不方便了
针对你的 rain-boots
Node.js 脚本工具,这里有一些改进建议和示例代码,帮助你更好地实现自动化任务。
建议
- 模块化设计:确保每个插件都遵循统一的设计模式,如每个插件都应有一个
rain
方法用于事件处理,以及一些实用函数集合(如.boots
)。 - 配置管理:将配置选项提取到一个单独的 JSON 文件中,以便于修改和维护。
- 错误处理:增加更多的错误处理逻辑,确保在出现异常情况时能够优雅地退出并提供有用的错误信息。
- 用户界面:可以考虑添加命令行参数解析库(如
yargs
或commander
),使脚本更加灵活易用。 - 文档:编写详细的文档,包括如何安装、配置及使用
rain-boots
。
示例代码
以下是一个简单的 rain-boots
插件 coffee-boots
示例:
const EventEmitter = require('events');
class CoffeeBoots extends EventEmitter {
constructor(config) {
super();
this.config = config;
}
watch() {
const { from, to } = this.config;
// 使用 fs.watchFile 监听文件变化
require('fs').watchFile(from, (curr, prev) => {
if (curr.mtime > prev.mtime) {
this.emit('compile', { from, to });
}
});
this.on('compile', (data) => {
const { from, to } = data;
const coffee = require('coffee-script');
const source = require('fs').readFileSync(from, 'utf8');
const compiled = coffee.compile(source);
require('fs').writeFileSync(to, compiled);
console.log(`编译 ${from} -> ${to}`);
});
}
}
module.exports = new CoffeeBoots({ from: 'a.coffee', to: 'a.js' });
如何使用
const coffeeBoots = require('./coffee-boots');
// 启动监听
coffeeBoots.watch();
总结
rain-boots
作为一个自定义脚本工具,主要目的是简化开发流程中的重复工作。你可以逐步扩展功能,根据具体需求加入更多插件,并确保代码清晰且易于维护。希望这些建议对你有帮助!