初探 ExtJS 6

Sencha Touch 现在已全面升级至ExtJs 6,那么我们如何使用他们呢?

首先去官网下载最新的sdk和帮助文档

sdk下载地址:https://www.sencha.com/products/extjs/evaluate/
ExtJS 6.2正式版下载:http://extjs.org.cn/node/793

如图,这个是试用版下载地址,试用版和正版的区别大概就是试用版有试用标记水印吧,大概是吧。

官方API文档:http://docs.sencha.com/extjs/6.0/

这个就是官方的在线API了,想要下载就把鼠标移动到左上角的Ext JS Guides上面去,如图

选择你想要下载的版本,点有括号的链接就能下载了。如图

以上准备完成之后,我们就来用用ExtJS 6吧

首先运行cmd命令行,输入以下命令:

sencha -sdk D:\ASPX\ext-premium-6.0.1\ext-6.0.1 generate app app D:\ASPX\Test\www

如图所示:

命令解释,在D:\ASPX\Test\www 目录下创建一个ext项目,命名空间是app

D:\ASPX\ext-premium-6.0.1\ext-6.0.1:你选择的sdk根目录

app D:\ASPX\Test\www:在指定目录创建一个项目,命名空间为app

ok,现在我们来看看效果,用谷歌浏览器打开项目,如图

我们把谷歌浏览器切换到手机模式试试,如图

这样效果和我们原来的sencha touch没啥差别了

看看index.html的代码

<!DOCTYPE HTML>
<html manifest="">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

    <title>app</title>

    
    <script type="text/javascript">
        var Ext = Ext || {}; // Ext namespace won't be defined yet...

        // 在这里检测设备类型,根据类型决定调用那个模块
        // 除了ext自带的现代版和经典版你还可以自定义一些模块
        Ext.beforeLoad = function (tags) {
            var s = location.search,  // the query string (ex "?foo=1&bar")
                profile;

            // For testing look for "?classic" or "?modern" in the URL to override
            // device detection default.
            //
            if (s.match(/\bclassic\b/)) {
                profile = 'classic';
            }
            else if (s.match(/\bmodern\b/)) {
                profile = 'modern';
            }
            else {
                profile = tags.desktop ? 'classic' : 'modern';
                //profile = tags.phone ? 'modern' : 'classic';
            }
            //最后profile的值是啥,就调用那个模块
            Ext.manifest = profile; // this name must match a build profile name

            // This function is called once the manifest is available but before
            // any data is pulled from it.
            //
            //return function (manifest) {
                // peek at / modify the manifest object
            //};
        };
    </script>
    
    
    <!-- The line below must be kept intact for Sencha Cmd to build your application -->
    <script id="microloader" data-app="95540398-5be2-4a4a-9cab-b172e28eb380" type="text/javascript" src="bootstrap.js"></script>

</head>
<body></body>
</html>

从注释可以看出,ext通过判断设备类型来决定调用那个模块来工作

隐藏掉一些无关目录文件,我们来看看项目结构,如图:

pp还是那个app,resources还是那个resources,sass呢也还是那个sass

不过多了classic和modern还有overrides

在ext里面,对于一些通用的东西我们可以放在app文件夹里面比如model、store和部分控制层的东西

然后classic和modern分别对应以前的ext和sencha touch,他们的src就相当于以前的app文件了。

overrides是拿来放重写类的文件夹

然后对于sencha touch来说ViewController和ViewModel是新东西,这个大家可以看看http://blog.csdn.net/sushengmiyan/article/details/38612721

最主要的是app.json发生了一些变化,具体说明看注释:

{
    /**
     * 应用程序的命名空间。
     */
    "name": "app",

    /**
     * 应用程序的版本。
     */
    "version": "1.0.0.0",

    /**
     * 起始页面名称(后缀可以是HTML,JSP,ASP等)。
     */
    "indexHtmlPath": "index.html",

    /**
     * 项目文件路径,也就是默认的modern/src和classic/src
     */
    "classpath": [
        "app",
        "${toolkit.name}/src"
    ],

    /**
     * 重写类文件目录路径,也就是默认的modern/overrides和classic/overrides
     */
    "overrides": [
        "overrides",
        "${toolkit.name}/overrides"
    ],

    /**
     * The Sencha Framework for this application: "ext" or "touch".
     * 不知道做啥用的,改成touch之后无法打包了
     */
    "framework": "ext",

    /**
     * 默认没有这个配置,如果配置就可以指定打包模式 "classic" or "modern".
     */
    "toolkit": "modern",

    /**
     * 默认没有这个配置,应用的主题名称,不要随便乱写
     */
    /**
    "theme": "ext-theme-crisp",
    */
    /**
     * 需要的扩展包 ( 默认是最新的).
     *
     * 例如,
     *
     *      "requires": [
     *          "charts"
     *      ]
     */
    "requires": [
        "font-awesome"
    ],

    /**
     * 打包相关配置
     */
    "fashion": {
        "inliner": {
            /**
             * 是否禁用资源的内联。默认情况下不启用。
             * 不知道做啥的
             */
            "enable": false
        }
    },

    /**
     * Sass 相关配置.
     */
    "sass": {
        /**
         * 命名空间映射 
         */
        "namespace": "app",

        /**
         * File used to save sass variables edited via Sencha Inspector. This file
         * will automatically be applied to the end of the scss build.
         *
         *      "save": "sass/save.scss"
         *
         */

        /**
         * 默认全局scss样式路径
         *
         *      +-------+---------+
         *      |       | base    |
         *      | theme +---------+
         *      |       | derived |
         *      +-------+---------+
         *      | packages        |  (in package dependency order)
         *      +-----------------+
         *      | application     |
         *      +-----------------+
         */
        "etc": [
            "sass/etc/all.scss",
            "${toolkit.name}/sass/etc/all.scss"
        ],

        /**
         * 默认全局scss 变量路径
         *
         *      +-------+---------+
         *      |       | base    |
         *      | theme +---------+
         *      |       | derived |
         *      +-------+---------+
         *      | packages        |  (in package dependency order)
         *      +-----------------+
         *      | application     |
         *      +-----------------+
         *
         * The "sass/var/all.scss" file is always included at the start of the var
         * block before any files associated with JavaScript classes.
         */
        "var": [
            "sass/var/all.scss",
            "sass/var",
            "${toolkit.name}/sass/var"
        ],

        /**
         *  默认全局scss 目录路径
         *      +-------+---------+
         *      |       | base    |
         *      | theme +---------+
         *      |       | derived |
         *      +-------+---------+
         *      | packages        |  (in package dependency order)
         *      +-----------------+
         *      | application     |
         *      +-----------------+
         */
        "src": [
            "sass/src",
            "${toolkit.name}/sass/src"
        ]
    },

    /**
     * 所需引用js文件
     * 单个格式如下
     *
     *      {
     *          // 文件路径,如果本地文件,路径相对于此app.json文件
     *          //
     *          "path": "path/to/script.js",   // REQUIRED
     *
     *          // 设置为true,表示所有的类生成到这个文件
     *          //
     *          "bundle": false,    // OPTIONAL
     *
     *          // 设置为true以包括级联的类文件。
     *          // 不清楚含义
     *          "includeInBundle": false,  // OPTIONAL
     *
     *          //设置为true,表示这个文件是一个远程文件不会被复制,默认false
     *          "remote": false,    // OPTIONAL
     *
     *          // 如果没有指定,这个文件将只加载一次,
     *          // 缓存到localStorage里面,直到这个值被改变。
     *          //
     *          //   - "delta" 增量更新此文件
     *          //   - "full" 当文件改变时,完全更新此文件
     *          //
     *          "update": "",        // OPTIONAL
     *
     *          // 设置为true,表示这是项目依赖文件。
     *          // 该文件不会被复制到生成目录或引用
     *          "bootstrap": false   // OPTIONAL
     *      }
     *
     */
    "js": [
        {
            "path": "app.js",
            "bundle": true
        }
    ],

    /**
     *  经典包所需引入的js
     */
    "classic": {
        "js": [
            // 删除此项将单独从框架加载源。
            {
                "path": "${framework.dir}/build/ext-all-rtl-debug.js"
            }
        ]
    },

    /**
     * 现代包所需引入的js
     */
    "modern": {
        "js": [
            // 删除此项将单独从框架加载源。
            {
                "path": "${framework.dir}/build/ext-modern-all-debug.js"
            }
        ]
    },

    /**
     * 所需引用css文件
     * 单个格式如下
     *      {
     *          // 文件路径,如果本地文件,路径相对于此app.json文件
     *          //
     *          "path": "path/to/stylesheet.css",   // REQUIRED
     *
     *          //设置为true,表示这个文件是一个远程文件不会被复制,默认false
     *          "remote": false,    // OPTIONAL
     *
     *          // 如果没有指定,这个文件将只加载一次,
     *          // 缓存到localStorage里面,直到这个值被改变。
     *          //
     *          //   - "delta" 增量更新此文件
     *          //   - "full" 当文件改变时,完全更新此文件
     *          //
     *          "update": ""      // OPTIONAL
     *      }
     */
    "css": [
        {
            // 输出css路径
            // 默认.sencha/app/defaults.properties
            "path": "${build.out.css.path}",
            "bundle": true,
            "exclude": [ "fashion" ]
        }
    ],

    /**
     * 应用加载配置
     *
     */
    "loader": {
                // 缓存配置
        //
        //   - true: 允许缓存 
        //   - false: 禁用缓存
        //   - other:不明白
        //
        "cache": false,

        // 缓存没有启用时传递的参数
        "cacheParam": "_dc"
    },

    /**
     * 打包命令相关配置
     */
    "production": {
        "output": {
            "appCache": {
                "enable": true,
                "path": "cache.appcache"
            }
        },
        "loader": {
            "cache": "${build.timestamp}"
        },
        "cache": {
            "enable": true
        },
        "compressor": {
            "type": "yui"
        }
    },

    /**
     * Settings specific to testing builds.
     */
    "testing": {
    },

    /**
     * Settings specific to development builds.
     */
    "development": {
        "tags": [
            // You can add this tag to enable Fashion when using app watch or
            // you can add "?platformTags=fashion:1" to the URL to enable Fashion
            // without changing this file.
            //
            // "fashion"
        ]
    },

    /**
     * Controls the output structure of development-mode (bootstrap) artifacts. May
     * be specified by a string:
     *
     *      "bootstrap": "${app.dir}"
     *
     * This will adjust the base path for all bootstrap objects, or expanded into object
     * form:
     *
     *      "bootstrap": {
     *          "base": "${app.dir},
     *          "manifest": "bootstrap.json",
     *          "microloader": "bootstrap.js",
     *          "css": "bootstrap.css"
     *      }
     *
     * You can optionally exclude entries from the manifest. For example, to exclude
     * the "loadOrder" (to help development load approximate a build) you can add:
     *
     *      "bootstrap": {
     *          "manifest": {
     *              "path": "bootstrap.json",
     *              "exclude": "loadOrder"
     *          }
     *      }
     *
     */
    "bootstrap": {
        "base": "${app.dir}",

        "manifest": "${build.id}.json",

        "microloader": "bootstrap.js",
        "css": "bootstrap.css"
    },

    /**
     *  输出配置,可以是字符串
     *      "${workspace.build.dir}/${build.environment}/${app.name}"
     *
     *  也可以是一个对象
     *
     *      {
     *          "base": "${workspace.build.dir}/${build.environment}/${app.name}",
     *          "page": {
     *              "path": "../index.html",
     *              "enable": false
     *          },
     *          "css": "${app.output.resources}/${app.name}-all.css",
     *          "js": "app.js",
     *          "microloader": {
     *              "path": "microloader.js",
     *              "embed": true,
     *              "enable": true
     *          },
     *          "manifest": {
     *              "path": "app.json",
     *              "embed": false,
     *              "enable": "${app.output.microloader.enable}"
     *          },
     *          "resources": "resources",
     *          "slicer": {
     *              "path": "${app.output.resources}/images",
     *              "enable": false
     *          },
     *          // 是否禁用缓存
     *          "appCache":{
     *              "enable": false"
     *          }
     *      }
     *
     */

    "output": {
        "base": "${workspace.build.dir}/${build.environment}/${app.name}",
        "page": "index.html",
        "manifest": "${build.id}.json",
        "js": "${build.id}/app.js",
        "appCache": {
            "enable": false
        },
        "resources": {
            "path": "${build.id}/resources",
            "shared": "resources"
        }
    },


    /**
    *  缓存配置
    *   "cache": {
    *       // 是否禁用缓存,为true将全局禁用
    *       "enable": false,
    *
    *       // 全局配置
    *       // 设置为deltas,或者true表示增量更新
    *       // 不设置或者为false将禁用
    *       "deltas": "deltas"
    *   }
    */

    "cache": {
        "enable": false,
        "deltas": "${build.id}/deltas"
    },


    /**
     * 自动生成的缓存文件配置
     */
    "appCache": {
        /**
         * 缓存目标
         */
        "cache": [
            "index.html"
        ],
        /**
         * 作用目录
         */
        "network": [
            "*"
        ],
        /**
         * 非作用目录?
         */
        "fallback": [ ]
    },

    /**
     * 项目生成时需要复制的资源文件
     */
    "resources": [
        {
            "path": "resources",
            "output": "shared"
        },
        {
            "path": "${toolkit.name}/resources"
        },
        {
            "path": "${build.id}/resources"
        }
    ],

    /**
     * 打包时忽略对象的正则表达式
     */
    "ignore": [
        "(^|/)CVS(/?$|/.*?$)"
    ],

    /**
     *    储存之前项目缓存目录的文件夹路径
     */

    "archivePath": "archive/${build.id}",



    /**
     * The space config object is used by the "sencha app publish" command to publish
     * a version of this application to Sencha Web Application Manager:
     * 不知道是啥
     *      "manager": {
     *          // the space id for this application
     *          "id": 12345,
     *
     *          // space host
     *          "host": "https://api.space.sencha.com/json.rpc",
     *
     *          // Either a zip file path or a folder to be zipped
     *          // this example shows how to publish the root folder for all build profiles
     *          "file": "${app.output.base}/../",
     *
     *          // These may be specified here, but are best specified in your user
     *          // ~/.sencha/cmd/sencha.cfg file
     *          "apiKey": "",
     *          "secret": ""
     *      }
     */

    /**
     * 输出配置,可以配置不同的模版
     *
     *     "builds": {
     *         "classic": {
     *             "toolkit": "classic",
     *             "theme": "theme-neptune"
     *         },
     *
     *         "modern": {
     *             "toolkit": "modern",
     *             "theme": "theme-neptune"
     *         }
     *     }
     *
     */

    "builds": {
        "classic": {
            "toolkit": "classic",

            "theme": "theme-triton",

            "sass": {
                // "save": "classic/sass/save.scss"
            }
        },

        "modern": {
            "toolkit": "modern",

            "theme": "theme-triton",

            "sass": {
                // "save": "modern/sass/save.scss"
            }
        }
    },


    /**
     * 唯一ID,作为localStorage前缀。
     * 通常情况下,你不应该改变这个值。
     */
    "id": "ebe06ef3-c353-495d-90ff-b3ca72030352"
}

打包之后的项目结构就是这样,如图

这种开发模式可以很方便的同时开发pc端和移动端

如果我们只是单独开发pc端或者移动端,在创建的时候我们可以根据需求这样加入classic或者modern命令

::创建pc端应用
sencha -sdk D:\ASPX\ext-premium-6.0.1\ext-6.0.1 generate app --classic app D:\ASPX\Test\www

项目结构如下:

打包后如下:

::创建移动端应用
sencha -sdk D:\ASPX\ext-premium-6.0.1\ext-6.0.1 generate app --modern app D:\ASPX\Test\www

项目结构如下:

打包后如下:

这样和以前也没啥区别了

作者:魔狼再世
原文:http://www.cnblogs.com/mlzs/p/4939045.html