问题出现的情景:
我们在写代码的时候很自然的会用到一些常量,习惯性的我们会定义在某一个类文件类,然后在其他的使用的地方引用这个类中的变量。
然后有一天,由于某些问题导致不得不修改某个已经定义好的常量的的值,这时候我们可能对服务器做增量方式的更新,那我们可能就值更新这常量问题,而其它相关使用这个常量的文件并没有更新,然而。。。。。,奇葩的问题就出现了。

情景案例
class A{
public static final String VERSION="1.0.0";
}
class B{
public static void main(){

 System.out.println(A.VERSION);

}
}
然后某天
我们修改了A
class A{
public static final String VERSION="1.0.1";
}
然鹅我们在服务器上只更新了A文件,并没有更新B文件,这是你会发现打印出来的还是1.0.0,并不是1.0.1

为什么会出现这个奇葩现象呢?

为了跟踪这个问题,我们使用java反编译工具发现,原来B反编译后的代码为:
class B{
public static void main(){

 System.out.println("1.0.0");

}
}
终于根源问题找到了

虽然问题找到了根源,但是为什么会出现这个情况呢?
我们定义常量的目的是为了更好的维护,但是在java编译过程中,由于对代码进行优化出现,自动的将相关常量信息编译自动连接编译到结果里,而不是引用类中的数据。那按这个方式理解,我们修改常某个常量就需要对所有涉及到的文件进行更新,这也就势必要求运维在更新时只能选择全量更新,而不能只更新某一个类文件。

那我的疑问就来了,那是不是我们编译后,这个常量文件是否还有存在的意义呢?

cmake -DCMAKE_INSTALL_PREFIX=/home/app/mysql -DMYSQL_DATADIR=/home/app/mysql/data -DSYSCONFDIR=/home/app/mysql/etc -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=boost

直接上代码

jsValue functionCallBack(jsExecState es, jsValue object, jsValue* args, int argCount) {

jsData* jsData = jsGetData(es, object);
char* funName= jsData->typeName;
if (strcmp("enterFullScreen",funName)==0) {
    HWND hDesk;
    RECT rc;
    hDesk = GetDesktopWindow();
    GetWindowRect(GetDesktopWindow(), &rc);
    HWND hwnd = wkeGetHostHWND(m_webview);
    GetWindowRect(hwnd, &mainWindowRect);
    SetWindowLong(hwnd, GWL_STYLE, WS_BORDER);
    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, rc.right, rc.bottom, SWP_SHOWWINDOW);
}else if (strcmp("exitFullScreen", funName)==0) {
    HWND hwnd = wkeGetHostHWND(m_webview);
    SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
    SetWindowPos(hwnd, HWND_NOTOPMOST, mainWindowRect.left, mainWindowRect.top, mainWindowRect.right - mainWindowRect.left, mainWindowRect.bottom - mainWindowRect.top, SWP_SHOWWINDOW);
}
else if (strcmp("quit",funName)==0) {
    jsValue params = jsArg(es, 0);
    wkeDestroyWebWindow(m_webview);
 }
return jsUndefined();

}

jsValue buildFunction(jsExecState es,char * name) {

jsData * data = new jsData();
memcpy(data->typeName, name,strlen(name));
data->callAsFunction = functionCallBack;
jsValue func = jsFunction(es, data);
return func;

}

/处理全屏显示/
jsValue bindClient(jsExecState es, void* param)
{

jsValue client = jsEmptyObject(es);
jsSet(es, client, "version", jsString(es, "1.0.0"));
jsSet(es, client, "copyRight", jsString(es, "版权所有禁止任何个人破解和未授权使用"));
jsSet(es, client, "enterFullScreen", buildFunction(es, "enterFullScreen"));
jsSet(es, client, "exitFullScreen", buildFunction(es, "exitFullScreen"));
jsSet(es, client, "quit", buildFunction(es,"quit"));
jsSet(es, client, "open", buildFunction(es, "open"));
return client;

}

然后使用下列代码绑定到miniblink
wkeJsBindGetter("Client", bindClient, &m_webview);


  private  static String formatVersion(String version) {
    return version!=null?version.replaceAll("[^0-9\\.\\-]", "").replaceAll("(^0+)|", "").replaceAll("(\\.0{2,})", "."):"0.0.0";
}
/**
 * 比较版本号
 * 支持格式:
 * V1.0.1,1.0.01, 1.0.1,1.0-10.1
 * @param source
 * @param dest
 * @return
 * =0 source version equals destination version 
 * >0 source version large than destination version
 * <0 source version less than destination version
 * 
 */
private static int compareVersion(String source,String destination) {
    String[] sourceItems = formatVersion(source).split("[._-]");
    String[] destItems = formatVersion(destination).split("[._-]");
    int diff=0;
    for(int idx=0,len=Math.min(sourceItems.length, destItems.length);idx<len;idx++) {
        diff=sourceItems[idx].compareTo(destItems[idx]);
        if(diff!=0) {
            break;
        }
    }
    return diff!=0?diff:(sourceItems.length-destItems.length);
}

rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。
安装方式:
npm install rollup -g
使用后方式:
1.直接使用命令:
rollup 源js文件目录 -o 输出js文件 -f cjs

2.使用配置文件(默认配置文件:rollup.config.js):
rollup -c xxxxx.js

使用配置文件参考格式

export default {
input: '源js文件入口',
output: {
file: '输出文件js地址',
exports: 'default',
format: 'umd',
name: '_',
amd: {

 id: '导出的模块编号',

},
noConflict: true,
sourcemap: true,
sourcemapExcludeSources: true,
legacy: true,
strict: false,
externalLiveBindings: false,
freeze: false,
},
plugins:[]
};

minify 用于min化生成好的js脚本文件
安装方式 :npm install minifier -g
使用方式:
在命令行中输入 minify xxxx.js
即可生成 xxxx.min.js