关于Grunt可视化的尝试
使用Grunt遇到的问题?
- 必须要安装
NodeJS - 必须安装
grunt-cli - 需要编写复杂的
Gruntfile.js规则 - 每个项目中必须存在nodejs的
grunt模块 - 不方便管理每一个包含grunt的项目
- 无法快速开始一个项目
解决思路
- 直接把
NodeJS跟grunt-cli包含进去? - 弄个有UI的界面来管理?
- 用程序简化gruntfile的规则?
- 将所有项目中需要的grunt模块包含到一起?
- 默认内置一些常用功能模块?
解决方案 -- nodewebkit
- 集成了
nodejs,省去NodeJS安装 - 集成
webkit内核,方便编写界面 - 适合前端人员开发
- 一次开发,兼容三大平台window/mac/linux
遇到问题
一.如何让NodeJS运行Grunt?
利用NodeJS的spawn运行cmd命令
//切换运行环境到项目中
process.chdir("项目地址");
//执行grunt
require("child_process").spawn("grunt");这种方案最简单,但需要依赖
NodeJS跟grunt-cli将grunt-cli的模块直接引进代码中,利用nodejs调用
var gruntpath = "grunt.js的路径";
var grunt = require(gruntpath);
grunt.cli();直接运行,提示找不到gruntfile.js,修改grunt文件夹中的
task.js,大概在430行左右var old_path = process.cwd();//获取当前工作目录
process.chdir('项目文件目录');//修改到项目目录
var gruntfile = allInit ? null : grunt.option('gruntfile') ||
grunt.file.findup('Gruntfile.{js,coffee}', {nocase: true});//查找gruntfile文件
process.chdir(old_path);//修改回程序目录
此处省略n行代码~~~
(grunt.option('npm') || []).forEach(task.loadNpmTasks);//加载npm的模块
process.chdir('项目文件目录');//切换到项目目录先切换到项目文件目录查找
gruntfile.js文件,然后切换回程序目录查找node模块,运行完grunt后,程序自动退出了,囧,需要修改grunt下的exit.jsprocess.exit(0);//这句需要注释掉
二.如何在子进程中运行Grunt?
利用NodeJS的child_process.fork
var child = require("child_process").fork("child.js");
child.onmessage = function(data){
console.log(data);
}
child.on("exit",function(exitCode){
console.log(exitCode);
});--运行后提示:unzip the package xx/child.js,上网各种谷歌之后得出作者结论:
child_process.fork is broken
--囧,就是这个方法是不能用了?继续谷歌之后得知
child_process.fork是无法运行js文件,它是直接运行执行命令
nw 文件夹
,所以修改一下,在child文件夹中也放一个package.json文件,执行后,果然成功了。--然后又留下一个大问题,无法使用fork的通信接口,囧,最后只好用
tcp来实现进程通信。--当我想打包成app测试的时候,发现,压根就不会运行子进程
child因为child_process.fork是运行
nw命令,所以,打包后是没有nw命令利用NodeJS的webworker来执行
npm install node-webworker之后引用
worker.jsvar Worker = require("worker.js");
var workker = new Worker("child.js");
worker.onmessage = function(data){
console.log(data);
}
worker.postmessage({msg:'hello'});运行后,发现child.js中的任何信息都无法传递回给父进程,最后发现在
worker.impl.buffer中保存了相关信息。var timeId = setInterval(function(){
var msg = worker.impl.buffer;
if(!msg)return false;
console.log(msg);
worker.imple.buffer = "";
},1000);虽然很挫,但还是实现了功能了,打包测试,发现一切OK。发送到其它电脑测试,提示:
spawn node not found,就是需要执行的命令找不到
奇怪,我没调用
spawn,哪来找不到?打开worker.js的源码查看,囧,发现:child_process.spawn("node xxx.js");囧,原来它是执行了
node的命令来实现子进程,坑爹了。利用HTML5的webworker
var worker = new Worker("child.js");
worker.onmessage = function(data){};
worker.postmessage("hello");测试后,发现成功运行,消息也正常接收,可...
webworker不支持运行nodejs代码,就是grunt无法跑起来。
三.目前可用方案
采用非子进程方式
- 无法同时跑多个grunt任务
- grunt没有提供结束的方法
- 需要手动清除grunt的watch任务以及很多变量值,比较麻烦
- 出错很可能会直接结束程序
独立将child内容打包成可执行文件,采用child_process.spawn执行
- 需要打开两个可执行文件,两个加起来至少也有80M
- 开发时,需要用fork,打包时候用spawn
安装NodeJS,采用webworker方式
- 电脑必须安装了NodeJs
- 目前较好的方案
- 未来nodewebkit支持子进程方式,可以比较方便修改过来
PS:暂时还没发现其它可以跑子进程方式,求其他大神解救
关于Grunt可视化的尝试的更多相关文章
- 【Grunt】关于Grunt可视化的尝试
使用Grunt遇到的问题? 必须要安装NodeJS 必须安装grunt-cli 需要编写复杂的Gruntfile.js规则 每个项目中必须存在nodejs的grunt模块 不方便管理每一个包含grun ...
- Kibana查询说明
elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 Kibana接口概述 Kibana接口分为四个主要部分: 发现 可视化 仪表板 设置 我们将按照列出的顺序浏览每个部分的 ...
- Gruntjs提高生产力(三)
以下例子来自真实项目,有所删减 grunt-test project 目录结构如下 一我的目的: 1.在src-dev目录中开发最终产出于src目录 2.src-dev中的index目录相当于一个wi ...
- 解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)
进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也寻找到 ...
- 解密国内BAT等大厂前端技术体系-百度篇(长文建议收藏)
1 引言 整个业界在前端框架不断迭代中,也寻找到了许多突破方向,例如跨平台中的RN.Flutter,服务端GraphQL.Serverless,前端和客户端的融合越来越紧密,前端在Node和Elect ...
- 【大厂】389- 解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)
进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也寻找到 ...
- ELK学习笔记之Kibana查询和使用说明
0x00 概述 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 Kibana接口概述 Kibana接口分为四个主要部分: 发现 可视化 仪表板 设置 我们将按照列出的顺 ...
- 解密国内BAT等大厂前端技术体系-美团点评之上篇(长文建议收藏)
引言 进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也 ...
- 翻译——3_Gaussian Process Regression
使用不同的机器学习方法进行预测 续上篇2_Linear Regression and Support Vector Regression 高斯过程回归 %matplotlib inline impor ...
随机推荐
- 魔兽世界服务器Trinitycore分析二:auth server的main函数
TrinityCore由生成两个运行文件authserver和world server以及一堆DLL(或so)文件的子项目组成(先忽略map_extractor等几个工具项目). authserver ...
- HDFS副本放置策略和机架感知
副本放置策略 的副本放置策略的基本思想是: 第一block在复制和client哪里node于(假设client它不是群集的范围内,则这第一个node是随机选取的.当然系统会尝试不选择哪些太满或者太忙的 ...
- Matlab学习第二天 利用插值
插入值一切手段: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDQ5MjI1Nw==/font/5a6L5L2T/fontsize/400/fi ...
- STL之sort函数的用法
说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL封装了一个排序算法,该算法相应的头文件为#include<algorithm>,我们能够依据须要对一个数组进行排序或者降序. so ...
- OC第四课
主要内容:NSString.NSArray.NSNumber 一.苹果公司的帮助文档(API) 学会查看API对于后续的编程有很好的帮助 进入方法: Xcode ->Help -> Doc ...
- JS实现全选,用于界面批量操作向后台传值时使用
function seltAll(){ var chckBoxSign = document.getElementById("ckb"); //ckb 全选/反选的选择框id va ...
- NM常用网络命令
Ipconfig命令 Ipconfig命令可以被用来显示机器当前TCP/IP配置信息. 当使用Ipconfig时不带不论什么參数选项,那么它为每一个已经配置好的接口显示IP地址.子网掩码和默认网关值. ...
- Windows,查看进程的连接的IP地址,批量模式,最后做成Excel
1.CMD -> netstat -ano,复制到UltraEdit 2.把双空格替换为单空格,这种替换要进行很多次,直到全部替换完.其次点20次替换就行了. 3.单空格替换为 ^t,也就是制表 ...
- UVA10537 Toll! Revisited
difkstra + 路径输出 The Toll! Revisited Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- [C++] 获取IE代理server的账号password
非常多程序须要使用'浏览器设置'的代理server,IE设置的代理server有可能是须要账号password的.如何编程获取浏览器设置的代理server的账号password呢? InternetQ ...