帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
The LiquidCore library provides independent, instantiable Node.js virtual machines for mobile apps each with its own lifecycle, virtual file system, and SQLite database.

  • 源代码名称:LiquidCore
  • 源代码网址:http://www.github.com/LiquidPlayer/LiquidCore
  • LiquidCore源代码文档
  • LiquidCore源代码下载
  • Git URL:
    git://www.github.com/LiquidPlayer/LiquidCore.git
  • Git Clone代码到本地:
    git clone http://www.github.com/LiquidPlayer/LiquidCore
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/LiquidPlayer/LiquidCore
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • LiquidCore项目

    LiquidCore为开发者提供了一种在Javascript中创建原生移动微型应用程序的环境,它可以被嵌入到其他应用程序中。 思考:移动应用的本地 <iframe>。 一个简单的应用程序仅仅可以在云端服务,因此在所有移动设备上都可以即时更新服务器端。

    LiquidCore还为Android开发者执行它的应用程序的原始 JavaScript inside 提供了一种方便的方法,因为iOS开发人员已经可以在。

    LiquidCore目前仅在Android上可用,但将被移植到 iOS。

    版本

    0.4.6 通过 JitPack获得它

    Release

    Javadocs

    版本 0.4.6

    目录

    本节介绍LiquidCore的两个主要的预期用例,包括 Hello World ! step-by-step示例。

    你还可以将LiquidCore用作原始原生Javascript引擎( 例如。 作为 AndroidJSCore的替代项。 这个话题是讨论这里的

    微型服务

    微型应用是建立在微型服务系统。 微服务仅仅是一个独立的node.js 实例,它的启动代码由URI引用。 例如:

    MicroService service =newMicroService(androidContext,
     newURI("http://my.server.com/path/to/code.js"));
    service.start();

    服务URI可以引用服务器URL或者本地Android资源( 比如。 android.resource://com.example.myapp/raw/some_js_filesome_js_file.jsres/raw/some_js_file.js --中注意,当使用Android资源时,在URI中省略了 .js。 虽然动态更新是一个重要的值,但是本地资源支持调试和/或者备份( 比如 ),因此LiquidCore主要用于远程 url。 如果网络不可用,则为工厂预置。

    一旦 node.js 环境建立,微型服务就可以与主机应用程序通信。 可以通过在 MicroService 构造函数中添加一个 ServiceStartListener 来确定:

    MicroService service =newMicroService(
     androidContext,
     newURI("http://my.server.com/path/to/code.js"),
     newMicroService.StartServiceListener() {
     @OverridepublicvoidonStart(MicroServiceservice, Synchronizersynchronizer) {
     //.. The environment is live, but the startup JS code (from the URI)// has not been executed yet. }
     }
    );
    service.start();

    微型服务通过简单的EventEmitter 接口和eponymously调用 LiquidCore 与主机通信。 例如在你的JavaScript启动代码( 本示例中的code.js ) 中:

    LiquidCore.emit('my_event', {foo:"hello, world", bar:5, l337 : ['a', 'b'] })

    在Java端,宿主应用程序可以侦听事件:

    //.. . in the StartServiceListener.onStart() method:service.on("my_event", newMicroService.EventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, JSONObjectpayload) {
     try {
     android.util.Log.i("Event:"+ event, payload.getString("foo"));
     // logs: I/Event:my_event: hello, world } catch (JSONException e) {
     e.printStackTrace();
     }
     }
    });

    类似地,微型服务可以侦听来自主机的事件:

    JSONObject payload =newJSONObject();
    payload.put("hallo", "die Weld");
    service.emit("host_event", payload);

    然后,在Javascript中:

    LiquidCore.on('host_event', function(msg) {
     console.log('Hallo, '+msg.hallo)
    })

    LiquidCore创建一个方便的虚拟文件系统,这样微型服务的实例不会无意或者恶意地互相干扰,或者其他的安卓 文件系统。 这里详细描述了文件系统( )。

    微型应用

    微服务有很多用途。 它们实际上是利用 node 社区所做的所有工作的有用之处。 但是我们希望能够创建自己的本机应用程序,这些应用程序不需要大量的交互。 为了实现这个目的,我们将引入一个更多的术语: 表面。曲面是用于微型服务的用户界面画布。

    目前有两个曲面:

    正在考虑其他曲面,包括:

    • WebSurface - 一个 WebView 前端,微型服务可以在其中写入 DOM
    • CardSurface - 一个适用于列表中用户界面元素的有限特性集
    • OpenGLSurface - 一个 OpenGL 画布

    最终,我们希望有虚拟/增强现实曲面,以及非图形画布,比如聊天和语音查询接口。

    "hallo,模具焊接"微型服务教程 !

    先决条件

    ( 你可以在这里的一个完整示例项目中找到所有代码 below 如果你被卡住的话)。

    要使用微型服务,你需要两件事: 微型服务代码和主机应用程序。

    我们首先创建一个非常简单的微服务,它只会向主机发送一个欢迎消息。 这将由我们网络上的一台机器提供。 首先在某个地方创建一个工作目录。

    $ mkdir ~/helloworld
    $ cd ~/helloworld

    然后,从 npm 安装LiquidCore服务器( 命名为 LiquidServer。):

    $ npm install -g liquidserver

    现在我们来创建一个微型服务。 在名为 service.js~/helloworld 目录中创建一个文件,并将它的填入以下内容:

    /* Hello, World! Micro Service */// A micro service will exit when it has nothing left to do. So to// avoid a premature exit, let's set an indefinite timer. When we// exit() later, the timer will get invalidated.setInterval(function() {}, 1000)// Listen for a request from the host for the 'ping' eventLiquidCore.on( 'ping', function() {
     // When we get the ping from the host, respond with"Hallo, die Weld!"// and then exit.LiquidCore.emit( 'pong', { message:'Hallo, die Weld!' } )
     process.exit(0)
    })// Ok, we are all set up. Let the host know we are ready to talkLiquidCore.emit( 'ready' )

    接下来,我们来设置一个 Manifest 文件。 现在不要太担心这个问题。 从基本上说,Manifest 允许我们基于主机提供的功能/权限来服务不同的版本。 但是对于我们的简单示例,我们将向任何请求者提供相同的文件。 在同一目录中创建一个名为 service.manifest的文件:

    {
     "configs": [
     {
     "file":"service.js" }
     ]
    }

    这告诉LiquidServer当请求传入 service.js 时,它应该服务于我们的service.js 文件。 这看起来有些傻,但是还可以设置其他有用的属性。 但是,出于我们的目的,它们还不需要。

    你现在可以运行你的服务器。 选择某个端口( 比如说,8080 ),否则LiquidServer将为你创建一个:

    $ liquidserver 8080

    你现在应该看到了 Listening on port 8080 恭喜你刚刚创建了一个微型服务。 你可以通过导航到浏览器中的http://localhost:8080/service.js 来测试它是否工作正常。 你应该看到你刚刚创建的service.js的内容,它使用了一些包装器代码。 包装器只是允许将多个 node.js 模块打包到一个文件中。 如果要将它的他一些 MODULE 设置为 require(),那么该 MODULE 及它的依赖项将被包装到这个单个文件中。

    你可以离开或者稍后重新启动。 现在我们需要创建一个主机应用程序。

    • 在 Android Studio 中,通过选择以下方法创建一个新项目 File -> New Project.. .
    • 填写基本内容并按 Next ( 应用程序 NAME: HelloWorld,公司域:liquidplayer.org,软件包 NAME: org.liquidplayer.examples.helloworld )
    • 填写目标设备的信息。 默认值很好。单击 Next
    • 选择 Empty Activity,然后选择 Next
    • 默认选项是确定的。 单击 Finish

    你现在有了一个基本的应用。 继续,在 模拟器 中运行它。 如果你没有明白为什么我们要创建一个"hallo,模具焊接"应用程序,你可能会看到为什么现在。 你已经从 Android Studio 获得"你好,世界"。 我们要用我们的微型服务来讲德语。

    接下来,打开 res/layout/activity_main.xml 文件。 我们需要做一些修改。 将内容替换为以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="org.liquidplayer.examples.helloworld.MainActivity">
     <TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"/>
     <Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="Sprechen Sie Deutsch!"/>
    </RelativeLayout>

    我们所改变的就是我们给了 TextView 一个 NAME: text,并添加了一个按钮。 继续,重新运行。 你现在应该在中间看到一个大按钮。

    现在是连接LiquidCore的时候了。 首先,你必须添加库。 转到根级别 build.grade 文件并添加 jitpack 依赖项:

    ...
    allprojects {
     repositories {
     jcenter()
     maven { url 'https://jitpack.io' }
     }
    }
    ...

    然后,将LiquidCore库添加到你的app的 build.gradle:

    dependencies {
    . . .
     implementation 'com.github.LiquidPlayer:LiquidCore:0.4.6'
    }

    请注意,如果使用旧的buildtools版本,则应该用 compile 替换 implementation

    继续并同步以确保库下载和链接正确。 再次运行该应用程序以确保一切都正常。

    现在,让我们把按钮连接到微型服务。 在应用程序中编辑 MainActivity.java,并将以下内容替换为以下内容:

    packageorg.liquidplayer.examples.helloworld;importandroid.os.Handler;importandroid.os.Looper;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;importorg.json.JSONException;importorg.json.JSONObject;importorg.liquidplayer.service.MicroService;importorg.liquidplayer.service.MicroService.ServiceStartListener;importorg.liquidplayer.service.MicroService.EventListener;importjava.net.URI;importjava.net.URISyntaxException;publicclassMainActivityextendsAppCompatActivity {
     // IMPORTANT: Replace this with YOUR server's address or nameprivatefinalString serverAddr ="192.168.1.152:8080";
     @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     finalTextView textView = (TextView) findViewById(R.id.text);
     finalButton button = (Button) findViewById(R.id.button);
     // Our 'ready' listener will wait for a ready event from the micro service. Once// the micro service is ready, we'll ping it by emitting a"ping" event to the// service.finalEventListener readyListener =newEventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, JSONObjectpayload) {
     service.emit("ping");
     }
     };
     // Our micro service will respond to us with a"pong" event. Embedded in that// event is our message. We'll update the textView with the message from the// micro service.finalEventListener pongListener =newEventListener() {
     @OverridepublicvoidonEvent(MicroServiceservice, Stringevent, finalJSONObjectpayload) {
     // NOTE: This event is typically called inside of the micro service's thread, not// the main UI thread. To update the UI, run this on the main thread.newHandler(Looper.getMainLooper()).post(newRunnable() {
     @Overridepublicvoidrun() {
     try {
     textView.setText(payload.getString("message"));
     } catch (JSONException e) {
     e.printStackTrace();
     }
     }
     });
     }
     };
     // Our start listener will set up our event listeners once the micro service Node.js// environment is set upfinalServiceStartListener startListener =newServiceStartListener() {
     @OverridepublicvoidonStart(MicroServiceservice, Synchronizersynchronizer) {
     service.addEventListener("ready", readyListener);
     service.addEventListener("pong", pongListener);
     }
     };
     // When our button is clicked, we will launch a new instance of our micro service. button.setOnClickListener(newView.OnClickListener() {
     @OverridepublicvoidonClick(Viewv) {
     try {
     URI uri =newURI("http://"+serverAddr+"/service.js");
     MicroService service =newMicroService(MainActivity.this, uri, startListener);
     service.start();
     } catch (URISyntaxException e) {
     e.printStackTrace();
     }
     }
     });
     }
    }

    确保将 serverAddr 更改为你的服务器地址。 现在,重新启动应用程序,然后单击按钮。 "Hello World"消息应该更改为德语。 你已经成功地将微型服务连接到主机应用程序 !

    要演示即时更新功能,请让应用程序和服务器运行。 现在,在服务器计算机上编辑 service.js 以使用不同的消息进行响应,然后保存:

    ...LiquidCore.emit( 'pong', { message:'Das ist super!' } )...

    返回应用程序并再次按按钮。 你的邮件应该更新。

    就是这样,这就是它的全部。 当然,这是一个过于简化的例子。 我们可以做其他有用的事情,比如利用现有的node.js 模块。 要尝试这里操作,请创建一个名为 bn.js的新文件,并将它的填充如下:

    var BigNumber =require('bignumber.js')setInterval(function() {}, 1000)LiquidCore.on( 'ping', function() {
     var x =newBigNumber(1011, 2) //"11"var y =newBigNumber('zz.9', 36) //"1295.25"var z =x.plus(y) //"1306.25"LiquidCore.emit( 'pong', { message:''+ x +' + '+ y +' = '+ z } )
     process.exit(0)
    })LiquidCore.emit( 'ready' )

    我们现在将使用 BigNumber MODULE。 请务必先安装它:

    % npm install bignumber.js

    你还需要在同一个目录中使用 Manifest 文件 bn.manifest:

    {
     "configs": [
     {
     "file":"bn.js" }
     ]
    }

    现在导航到浏览器中的http://localhost:8080/bn.js,现在你应该看到 bignumber.js MODULE 已经被包装了。

    在Hallo中,模具焊接应用程序,更改以下行:

    URI uri =newURI("http://"+serverAddr+"/service.js");

    到:

    URI uri =newURI("http://"+serverAddr+"/bn.js");

    然后重新启动应用程序。当单击按钮时,应该看到一个使用 MODULE的方程式。

    好的,最后一个小技巧。 让我们修改 bn.manifest 文件以包含转换。 替换为:

    {
     "configs": [
     {
     "file":"bn.js",
     "transforms": [ "uglifyify" ]
     }
     ]
    }

    你需要清除服务器高速缓存,因此只需使用 delete 目录:

    % rm -rf ~/helloworld/.lib

    然后重新启动服务器。 现在导航到 http://localhost:8080/bn.js 时,你将看到代码已经被缩小以节省空间。 Manifest 文件可以做很多事情,但是我们将保存它,因为它仍然处于初期。

    构建 LiquidCore Android库

    如果你对直接生成库和可能有贡献感兴趣,则必须执行以下操作:

    % git clone https://github.com/liquidplayer/LiquidCore.git
    % cd LiquidCore/LiquidCoreAndroid
    % echo ndk.dir=$ANDROID_NDK> local.properties
    % echo sdk.dir=$ANDROID_SDK>> local.properties
    %./gradlew assembleRelease

    你的库现在位于 LiquidCoreAndroid/build/outputs/aar/LiquidCore-release.aar 要使用它,只需将以下内容添加到你的应用程序 build.gradle:

    repositories {
     flatDir {
     dirs '/path/to/lib'
     }
    }
    dependencies {
     implementation(name:'LiquidCore-release', ext:'aar')//'compile' on older buildtools versions
    }
    注释

    node.js 库( libnode.so ) 预先编译并在 deps/node-8.9.3/prebuilt 中包含为二进制形式。 生成库所需的所有修改都包含在 deps/node-8.9.3 中。 要构建每个库的( 如果你选择),请参见这里的指令

    许可证

    版权( c ) 2014 -2018 Eric Lange。 保留所有权利。

    如果满足以下条件,则允许在源和二进制表单中重新分配和使用,以及不修改:

    • 以源代码形式重新发布必须保留未经修改的上述版权声明、本许可条件以及其后的免责声明。

    • 二进制表单中的with必须重现 上面 版权声明,这里条件列表和以下文件和/或者它的他材料中的声明。

    软件由版权持有者和贡献者"是"提供,包括明示或者默示担保,包括但不限于适销性担保和适用于特定用途的FITNESS和适合。 任何EVENT或者侵犯人,不论合同中出现的任何LIABILITY或者侵权情况,均不得承担任何直接。间接。偶然。特殊。范例或者侵权责任,即使通知可能发生此类损害。




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语