Cordova Hook指南

预备知识

  1. 会撸nodejs;
  2. 简单shell脚本;

官方指南看这里


应用场景

hook,钩子,提供在某些特定时刻执行脚本的能力; 目前模板工程已经内置了一些钩子,比如压缩Android中www目录,更改config.xml中的版本号等等,这些钩子主要针对原生工程或者Cordova工程配置方面做一些操作。对于前端开发人员来说,在打包之前可能要对www中的内容进行压缩、混淆或者文件拷贝、转移等等之类的操作,hook就能派上用场了;


Cordova Hook类型

类型是指Cordova生命周期的各个阶段点,比如在编译前,安装插件前后,安装插件后等等。类型清单以及说明可以参考这里

针对www目录的操作来说,使用before_prepare类型即可;


Hook配置

Hook配置在config.xml中,可以分平台指定,也可以全局指定;如下图

hook配置

写好的Hook脚本通过APPCloud平台上传。


Hook编写

先看个样例

module.exports = function(ctx) {

    // 平台判断
    if (ctx.opts.platforms.indexOf('android') < 0) {
        return;
    }

    // 全局使用shelljs
    ctx.requireCordovaModule('shelljs/global');

    // 工程根目录
    var projectRoot = ctx.opts.projectRoot;

    // path模块引入
    var path = ctx.requireCordovaModule('path');

    // 第三方模块zip-dir引入
    var customNodeModuleRoot = projectRoot + '/scripts/node_modules/';
    var zipdir = require(customNodeModuleRoot + 'zip-dir');

    var wwwDir = path.join(projectRoot,'platforms/android/assets/www');
    var wwwZipFilePath = path.join(projectRoot, 'platforms/android/assets/www.zip');
    echo('begin to zip android www content...');
    zipdir(wwwDir, { saveTo: wwwZipFilePath }, function (err, buffer) {
        if (err) {
            echo('zip android www content error: ' + error);
            exit(1);
        }else{
            echo('clear android www content...');
            rm('-rf', wwwDir);
            echo('zip android www content finish...');
        }
    });
};

cordova中内置node模块清单

iOS

hook配置

Android

hook配置

  • 引用内置node模块,使用ctx.requireCordovaModule('module-name');
  • 引用第三方node模块,使用以下: var customNodeModuleRoot = projectRoot + '/scripts/node_modules/'; var module = require(customNodeModuleRoot + 'module-name');

    同时在工程目录scripts/package.json中的dependencies添加依赖关系;

results matching ""

    No results matching ""