JSPatch在MAC下的使用
2016-02-22 17:37
525 查看
简单调研JSPatch的使用,之所以在MAC下是因为可以创建一个命令行的应用,简化无关代码。具体做法如下:
第一步,去https://github.com/bang590/JSPatch/tree/master/JSPatch下载JSEngine.h、JSEngine.m和JSPatch.js三个文件,并拖入工程,并选择Copy items if needed:
第二步,添加一个被测试的类,并给它定义一个类方法,稍后我们将用JSPatch替换该方法。我在该方法中输出了字符串:Hello World!
第三步,在main函数中接收两个参数,一个是在第一步中下载的JSPatch.js,另一个是用来做热补丁的js文件,命名为demo.js
紧接着就可以执行JSPatch的策略了,之后才是业务逻辑。必须在执行业务逻辑之前执行JSPatch策略,这样才能让对业务逻辑中的类或方法的替换生效。
第四步,编写热补丁文件,用于替换第二步中的TestObj的mainProc方法:
以上就是应用JSPatch替换掉OC代码中TestObj的mainPrco方法的步骤,不过要想在MAC Command Line下能跑,还得对JPEngine稍作修改:
1、JPEngine依赖了UIKit/UIApplication.h,这是应用于iOS UIKit的头文件,可以直接注掉。
2、在startEngine函数中有如下一段调用,这也是在iOS中用于响应内存警告的,也可以直接注掉。
3、紧接着往下是如下一段代码,这是直接在bundle中查找JSPatch.js,而我们创建的是命令行应用而不是app,尽管在第一步中把JSPatch.js拖入了工程,通过下面的方法也是拿不到JSPatch.js的,
因此,我把JPEngine的startEngine方法由无参改成接收一个NSSting*参数,通过命令行第一个参数把JSPatch.js的路径传进来,前面这段代码可以改为如下,jsPatchPatch是startEngine的参数
经过以上改造,JSPatch就可以在MAC下使用了。实例代码可在https://github.com/palanceli/TestJSPatch/tree/master下载。
本文只是简单摸索一下JSPatch的使用,并没有深入到JSPatch内部,据说这种热补丁覆盖面太广会让效率不彰,因为它是利用字符串反射找到对应类和方法的。我认为JSPatch的应用目标就是用来打补丁而不是用于组件化,临时遇到bug,需要紧急修复还是很适合用JSPatch的,下发一个js文件即可,小巧、便捷,组件化的问题则要靠框架设计来解决。
第一步,去https://github.com/bang590/JSPatch/tree/master/JSPatch下载JSEngine.h、JSEngine.m和JSPatch.js三个文件,并拖入工程,并选择Copy items if needed:
第二步,添加一个被测试的类,并给它定义一个类方法,稍后我们将用JSPatch替换该方法。我在该方法中输出了字符串:Hello World!
// TestObj.h #import <Foundation/Foundation.h> @interface TestObj : NSObject -(void)mainProc; @end
//TestObj.m #import "TestObj.h" @implementation TestObj -(void)mainProc { NSLog(@"Hello World!"); } @end
第三步,在main函数中接收两个参数,一个是在第一步中下载的JSPatch.js,另一个是用来做热补丁的js文件,命名为demo.js
紧接着就可以执行JSPatch的策略了,之后才是业务逻辑。必须在执行业务逻辑之前执行JSPatch策略,这样才能让对业务逻辑中的类或方法的替换生效。
#import <Foundation/Foundation.h> #import "JPEngine.h" #import "TestObj.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 传入JSPatch.js和demo.js的路径 if (argc != 3) { NSLog(@"usage: testJP [JSPatch.js path] [replace js path]"); return -1; } NSString *jsPatchPath = [NSString stringWithUTF8String:argv[1]]; NSString *replaceJSPath = [NSString stringWithUTF8String:argv[2]]; [JPEngine startEngine:jsPatchPath]; NSString *script = [NSString stringWithContentsOfFile:replaceJSPath encoding:NSUTF8StringEncoding error:nil]; [JPEngine evaluateScript:script]; // 实例化TestObj,并调用将被JSPath替换的方法 TestObj *obj = [[TestObj alloc]init]; [obj mainProc]; } return 0; }
第四步,编写热补丁文件,用于替换第二步中的TestObj的mainProc方法:
// demo.js // 替换TestObj的mainProc方法 defineClass('TestObj', { mainProc: function() { console.log("Hello, JSPatch!"); } });
以上就是应用JSPatch替换掉OC代码中TestObj的mainPrco方法的步骤,不过要想在MAC Command Line下能跑,还得对JPEngine稍作修改:
1、JPEngine依赖了UIKit/UIApplication.h,这是应用于iOS UIKit的头文件,可以直接注掉。
2、在startEngine函数中有如下一段调用,这也是在iOS中用于响应内存警告的,也可以直接注掉。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
3、紧接着往下是如下一段代码,这是直接在bundle中查找JSPatch.js,而我们创建的是命令行应用而不是app,尽管在第一步中把JSPatch.js拖入了工程,通过下面的方法也是拿不到JSPatch.js的,
NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"JSPatch" ofType:@"js"]; NSAssert(path, @"can't find JSPatch.js"); NSString *jsCore = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:path] encoding:NSUTF8StringEncoding];
因此,我把JPEngine的startEngine方法由无参改成接收一个NSSting*参数,通过命令行第一个参数把JSPatch.js的路径传进来,前面这段代码可以改为如下,jsPatchPatch是startEngine的参数
//*#*# 注掉path,改为传参 // NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"JSPatch" ofType:@"js"]; // NSAssert(path, @"can't find JSPatch.js"); NSString *jsCore = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:jsPatchPath] encoding:NSUTF8StringEncoding];
经过以上改造,JSPatch就可以在MAC下使用了。实例代码可在https://github.com/palanceli/TestJSPatch/tree/master下载。
本文只是简单摸索一下JSPatch的使用,并没有深入到JSPatch内部,据说这种热补丁覆盖面太广会让效率不彰,因为它是利用字符串反射找到对应类和方法的。我认为JSPatch的应用目标就是用来打补丁而不是用于组件化,临时遇到bug,需要紧急修复还是很适合用JSPatch的,下发一个js文件即可,小巧、便捷,组件化的问题则要靠框架设计来解决。
相关文章推荐
- JSON的在javascript中的常用方法
- iClient for JavaScript VectorLayer详细使用指南
- EXTJS4.x以上的版本中没有dolayout这个方法
- Jsoup爬取网页上表格数据
- javascript 性能检测
- js-比较两个日期的大小
- js-字符串转化日期
- js"面向对象"和"继承"的碎碎念
- [LeetCode][JavaScript]Increasing Triplet Subsequence
- JS正则表达式大全
- JavaScript 执行环境及作用域
- JSONHelper
- javascript的回调函数 同步 异步
- js去除重复项
- JSTL标签
- JavaScript 中 Property 和 Attribute 的区别详解
- jsp正确引入js文件的方法
- 深入理解seajs之配置指南
- JavaScript 中 Property 和 Attribute 的区别详解
- JS模块化和闭包