我完成了Apache Cordova教程

因为有Apache Cordova的教程,所以我做了它。

我试过的是这个 cordova 教程。

你为什么在使用Cordova?

我会对Cordova做一个简要介绍。Cordova是一个跨平台应用程序开发框架,最初由Nitobi公司开发,并被Adobe收购后作为开源项目贡献给Apache。这个框架已经存在于2009年,因此已经积累了很多功能。尽管现在有很多流行的单页应用程序框架,但我选择使用Cordova作为一种折衷的解决方案,因为对其它框架不是很了解。

以下是任务。因为这是教程的原样,所以可能没有太多意义。不过只有使用了nodebrew这一部分有点不一样。我只是在浏览器上完成的。

准备环境

模块1:创建一个Cordova项目

暂时先用nodebrew安装node.js。

curl -L git.io/nodebrew | perl - setup

安装完成后,最新的v4.0.0版本已经包含在其中。

nodebrew list
v4.0.0

which npm
/Users/myname/.nodebrew/current/bin/npm

不知道为什么,总觉得礼节有点相似,所以我提前使用了。

nodebrew use v4.0.0

由于Cordova需要在命令行中设置环境,因此需要安装命令行。

npm install -g cordova
which cordova
/Users/yourname/.nodebrew/current/bin/cordova

应用程序的初始创建

模块2:构建一个Cordova项目

创建一个与自己的包名和工作项目的目录相对应的文件夹。将yourname替换为自己的名字。

cordova create workshop com.yourname.workshop Workshop

我到目录中去

cd workshop

在这里,教程中会要求选择平台(如iOS或Android),但暂时我不打算添加,因为我想先通过浏览器了解一下它们是什么样的。

我不知道用了什么插件,但是因为它似乎会在后面的教程中用到,所以我安装了插件。

安装所需的插件

cordova plugin add org.apache.cordova.device
cordova plugin add org.apache.cordova.console

看起来在安装了插件之后,我在某处看到了在浏览器中运行时应该这样做,所以我提前做了这个。

设置可移动的平台

cordova platform add browser

然后,他们安装了一个用于浏览器的插件。按照步骤来说,应该先执行platform add,但是后来是否也能追随进行呢?

cordova platform add browser
Adding browser project...
Running command: /Users/yourname/.cordova/lib/npm_cache/cordova-browser/4.0.0/package/bin/create /Users/yourname/Dropbox/Develop/workshop/platforms/browser com.yourname.workshop Workshop
Creating Browser project. Path: platforms/browser
Discovered plugin "cordova-plugin-whitelist" in config.xml. Installing to the project
Fetching plugin "cordova-plugin-whitelist@1" via npm
Installing "cordova-plugin-whitelist" for browser

This plugin is only applicable for versions of cordova-android greater than 4.0. If you have a previous platform version, you do *not* need this plugin since the whitelist will be built in.

Installing "cordova-plugin-console" for browser
Installing "cordova-plugin-device" for browser

目前为止,只是用浏览器打开了一下,大概就是这个样子。

動いてるのかな

这似乎是处于停止状态,或者说需要进行正确的构建操作。

构建已设置的应用

下面是制作浏览器版本的构建的步骤。

cordova build browser
Running command: /Users/ishimaru/Dropbox/Develop/workshop/platforms/browser/cordova/build 
Cleaning Browser project
Browser packaged app built in platforms/browser/build/package.zip

构建时,平台目录内会有浏览器、iOS等文件夹,其中的build文件夹内似乎会生成一个zip文件。

在浏览器上进行模拟操作(看起来没什么意义,哈哈)

cordova emulate browser

那么,我收到了一条消息说它在移动。太好了。

スクリーンショット 2015-12-15 19.23.37.png

我不明白「DEVICE IS READY」指的是什么,但是我会继续下一步。

设置教程用的文件并进行简易操作

第三模块:设置工作坊文件

如果你一旦把它消除掉。(´・ω・`)

pwd /Users/yourname/Dropbox/Develop/workshop
rm -rf www

据说他们复制了一个副本,打算把startar-www复制到www。

git clone https://github.com/ccoenraets/cordova-tutorial
cd cordova-tutorial
cp -pR starter-www ../www
スクリーンショット 2015-12-15 19.42.38.png
スクリーンショット 2015-12-15 19.42.53.png

我特地进行了构建,但是通常在浏览器中打开文件时,它的运行方式相同。

要尝试从服务器端获取JSON的请求动作。

模块4:选择数据存储策略

要尝试从服务器端获取JSON数据。

<script src="js/services/memory/EmployeeService.js"></script>

将此放置于www/index.html中:

改成这样应该会不错。试试更换一下内部实现装置吧。

服务器端需要进入”/Users/ishimaru/Dropbox/Develop/workshop/cordova-tutorial/server”这个位置,这是git clone的地方。然后,先安装node module并运行服务器。

cd cordova-tutorial/server
npm install

请查看package.json的内容并执行安装操作,安装的文件将存放在node_modules目录中,然后使用它来运行服务器。

node server

虽然看不清楚,但它动了。

听说要将对话框本地化

第五模块:使用本地通知

安装对话框插件。

cordova plugin add org.apache.cordova.dialogs

把生成的 Cordova 用的 js 文件加载到 index.html 中

<script src="cordova.js"></script>
</body>
</html>

编写覆盖浏览器的window.alert函数的逻辑。

document.addEventListener('deviceready', function () {
  if (navigator.notification) { // Override default HTML alert with native dialog
      window.alert = function (message) {
          navigator.notification.alert(
              message,    // message
              null,       // callback
              "Workshop", // title
              'OK'        // buttonName
          );
      };
  }
}, false);

然后,运行以下命令进行构建并查看。

cordova 构建 浏览器
cordova 模拟浏览器

帮助按钮按了也没有弹窗呢,算了。

进行下一个动作。

好像要立即解決点击延迟300毫秒的问题。

第六模块:避免300毫秒的点击延迟

我开始阅读 fastclick.js 这个文件了。

<script src="lib/fastclick.js"></script>
<script src="cordova.js"></script>
</body>
</html>

添加了FastClick.attach。

document.addEventListener('deviceready', function () {
  if (navigator.notification) { // Override default HTML alert with native dialog
      window.alert = function (message) {
          navigator.notification.alert(
              message,    // message
              null,       // callback
              "Workshop", // title
              'OK'        // buttonName
          );
      };
  }
}, false);
FastClick.attach(document.body);

我其实不太明白,但是因为警告弹出了,所以就算是没问题。

将其转化为单页应用程序。

模块7:建立一个单页面应用

好像是要删除除了script标签以外的body标签中的所有DOM。在其他框架(比如Monaca)中,通常也是首先删除再执行。

变成这样了。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
</head>
<body>

<script src="cordova.js"></script>
<script src="lib/fastclick.js"></script>
<script src="lib/jquery.js"></script>
<script src="js/services/memory/EmployeeService.js"></script>
<script src="js/app.js"></script>

</body>
</html>

在js中创建一个函数来生成最初在index.html中写入的dom。将其放在本地函数的代码块中。

    function renderHomeView() {
        var html =
            "<h1>Directory</h1>" +
            "<input class='search-key' type='search' placeholder='Enter name'/>" +
            "<ul class='employee-list'></ul>";
        $('body').html(html);
        $('.search-key').on('keyup', findByName);
    }

然后,将该函数调用放在service.initialize之后的位置。

    service.initialize().done(function () {
        renderHomeView();
    });

然后,删除“Event Registration”区块中重复的处理。
通过查看renderHomeView的处理内容,我们可以知道在其中实现了从body中删除帮助按钮,并在释放search-key键盘时开始搜索的事件处理,因此需要删除以下两个区块。

$('.search-key').on('keyup', findByName);
$('.help-btn').on('click', function() {
    alert("Employee Directory v3.4");
});

现在修复已经完成了,接下来需要进行功能确认。
因为不太清楚,所以我将app.js的所有结果源码都写在这里。

// We use an "Immediate Function" to initialize the application to avoid leaving anything behind in the global scope
(function () {

    /* ---------------------------------- Local Variables ---------------------------------- */
    var service = new EmployeeService();
    service.initialize().done(function () {
        renderHomeView();
    });

    /* --------------------------------- Event Registration -------------------------------- */
    document.addEventListener('deviceready', function () {
        if (navigator.notification) { // Override default HTML alert with native dialog
            window.alert = function (message) {
                navigator.notification.alert(
                    message,    // message
                    null,       // callback
                    "Workshop", // title
                    'OK'        // buttonName
                );
            };
        }
    }, false);
    FastClick.attach(document.body);

    /* ---------------------------------- Local Functions ---------------------------------- */
    function findByName() {
        service.findByName($('.search-key').val()).done(function (employees) {
            var l = employees.length;
            var e;
            $('.employee-list').empty();
            for (var i = 0; i < l; i++) {
                e = employees[i];
                $('.employee-list').append('<li><a href="#employees/' + e.id + '">' + e.firstName + ' ' + e.lastName + '</a></li>');
            }
        });
    }

    function renderHomeView() {
        console.log("renderHomeView start");
        var html =
            "<h1>Directory</h1>" +
            "<input class='search-key' type='search' placeholder='Enter name'/>" +
            "<ul class='employee-list'></ul>";
        $('body').html(html);
        $('.search-key').on('keyup', findByName);
        console.log("renderHomeView end");
    }

}());

在进行操作确认时,发现可以正常运行,因此一切顺利。

为了确认操作,需要进行构建和运行应用程序,以下是一种方式。

cordova build ios
cordova emulate ios

由于我是一个浏览器,所以什么也没做。

看起来现在算是基本上成为了单页应用了,但是感动程度真的是无语(笑)。

由于在字符串中编写HTML有点麻烦,所以听说要引入模板引擎。

模块8:使用Handlebars模板

事前准备时确保读取库的CSS和js。

将body读取为模板引擎的主体源代码。Template引擎应该是handlebars。

<script src="lib/handlebars.js"></script>

另外,我们可以给移动设备应用上一个名为Ratchet的样式表。

我在index.html的头部添加了以下内容。

<link href="assets/ratchet/css/ratchet.css" rel="stylesheet">
<link href="assets/css/styles.css" rel="stylesheet">

然后,似乎要将HTML移到模板引擎中。

据说通常将它放在标签中,但这种形式有点奇怪。就好像在

广告
将在 10 秒后关闭
bannerAds