一、使用 Cordova-CLI 建立的工程目錄結(jié)構(gòu)
使用 cordova create
命令建立的工程,結(jié)構(gòu)如下:
./
|-hooks/ ............ 一些build時的特殊腳本
|-platforms/ ........ 原生平臺代碼
|-plugins/ .......... 插件
|-www/ .............. Web內(nèi)容
| '-index.html
'-config.xml ........ 工程配置文件,包括工程id、名字、描述、一些白名單等等
二、使用 Cordova-CLI,創(chuàng)建的 iOS 工程
./HelloCordova/
|-CordovaLib/ .................................. Cordova 庫
|-HelloCordova/ ................................ Cordova iOS 工程
| |-Classes/
| |-Plugins/ .................................. 插件原生代碼
| | |-cordova-plugin-console/ ................ 示例
| | | |-CDVLogger.h
| | | '-CDVLogger.m
| | |-cordova-plugin-inappbrowser/ ........... 示例
| | | |-CDVInAppBrowser.h
| | | '-CDVInAppBrowser.m
| | '-README
| |-config.xml ................................ iOS工程的配置,包括引用的插件、引用方式等,可由 Cordova-CLI 生成
| '-main.m
|-HelloCordova.xcodeproj/ ...................... 工程文件
|-HelloCordova.xcworkspace/ .................... Workspace 文件
|-cordova/ ..................................... 用于執(zhí)行 build 的相關(guān)腳本內(nèi)容,與代碼無關(guān)
|-platform_www/ ................................ 平臺相關(guān)的 Web 內(nèi)容
| |-cordova-js-src/
| | |-exec.js
| | '-platform.js
| |-plugins/ .................................. 插件相關(guān)的 js 代碼
| | |-cordova-plugin-console/ ................ 示例
| | | '-www/
| | | |-console-via-logger.js
| | | '-logger.js
| | '-cordova-plugin-inappbrowser/ ........... 示例
| | '-www/
| | '-inappbrowser.js
| |-cordova.js
| '-cordova_plugins.js ........................ 用于導(dǎo)入所引用插件相關(guān)的配置的 js,由引用的插件內(nèi)容而定
|-www/ ......................................... 自定義的 Web 內(nèi)容 + platform_www/ 中的內(nèi)容
| |-cordova-js-src/
| | |-exec.js
| | '-platform.js
| |-plugins/
| | |-cordova-plugin-console/
| | | '-www/
| | | |-console-via-logger.js
| | | '-logger.js
| | '-cordova-plugin-inappbrowser/
| | '-www/
| | '-inappbrowser.js
| |-cordova.js
| |-cordova_plugins.js
| '-index.html
'-ios.json .................................... 所引用插件相關(guān)的配置,標(biāo)準(zhǔn) JSON,其中 modules 部分與 cordova_plugins.js 的 module.exports 部分內(nèi)容相同,可以直接通過iOS解析,獲取所引用的插件信息。此文件不會被打包。
特定平臺工程和 Cordova 工程都包含了 config.xml
文件,目前的理解:
- Cordova 工程中的
config.xml
,是一些跨平臺的通用配置。 - 特定平臺工程中的
config.xml
,除了包含通用配置,還有一些平臺的特性化配置,比如:引用插件、插件的加載執(zhí)行方式等等。
三、使用 Cordova-CLI 打包后的結(jié)構(gòu)
使用 cordova build
命令打包后的目錄結(jié)構(gòu)(以 iOS 為例,除原生代碼外,都在 www
文件夾中,手集成 CordovaLib 的話,文件夾可以自己定義):
./www/
|-cordova-js-src/ ................. 存放用于與原生功能橋接的JS(無需改動)
| |-exec.js ...................... 無需改動
| '-platform.js .................. 無需改動
|-plugins/ ........................ 插件 js 部分的代碼
| |-cordova-plugin-console/
| | '-www/
| | |-console-via-logger.js
| | '-logger.js
| '-cordova-plugin-inappbrowser/
| '-www/
| '-inappbrowser.js
|-cordova.js ...................... 用于加載插件,一般在 index.html 中引用(無需改動)
|-cordova_plugins.js .............. 所有引用的插件(需要根據(jù)引用的插件來進行調(diào)整)
'-index.html
這些在 www
中的內(nèi)容,除了index.html
,其余的并沒有出現(xiàn)在 Cordova 工程中。
從一、二兩個結(jié)構(gòu)的比較中可以看出:“二”中的以下文件并沒有包含在“一”中:
cordova-js-src/ ................. 存放用于與原生功能橋接的JS(無需改動)
|-exec.js ...................... 無需改動
'-platform.js .................. 無需改動
cordova.js ...................... 用于加載插件,一般在 index.html 中引用(無需改動)
cordova_plugins.js .............. 所有引用的插件(需要根據(jù)引用的插件來進行調(diào)整)
這些內(nèi)容屬于:
- 應(yīng)用在 JS 執(zhí)行原生調(diào)用時需要
- 但又不需要手工編輯
所以在 Cordova 工程中沒有出現(xiàn),而是在 Cordova-CLI 進行打包的過程中塞了進去。
四、在自己工程中引入 CordovaLib
對于在自己的工程中引入 Cordova 的情況,需要在工程中引入 config.xml
。如果需要進行原生插件調(diào)用,把“二”中的內(nèi)容加進去,并保證這些頁面能正常加載到這些 JS。
五、plugin 目錄結(jié)構(gòu)
通過 Cordova-CLI 安裝的插件,需要按照一定的格式組織代碼。
./cordova-plugin-console/
|-doc/ ......................... 文檔目錄
|-src/ ......................... 源碼目錄(重要:需要編寫代碼)
| |-ios/ ...................... 平臺分類 iOS
| | |-CDVLogger.h
| | '-CDVLogger.m
| |-ubuntu/ ................... 平臺分類 Ubuntu
| | |-console.cpp
| | '-console.h
| '-wp/ ....................... 平臺分類 Windows Phone
| '-DebugConsole.cs
|-tests/ ....................... 測試文件夾
| |-plugin.xml
| '-tests.js
|-www/ ......................... 用于與原生代碼交互的 js(重要:需要編寫代碼)
| |-console-via-logger.js
| '-logger.js
|-package.json ................. 插件的說明信息,用于搜索等作用,貌似對程序沒有實際作用
'-plugin.xml ................... 插件的配置文件,其中包含每個平臺的配置,使用命令行安裝插件時,會把文件中各個平臺的內(nèi)容,插入到各個平臺代碼的 config.xml 中(重要:需要開發(fā)插件時編寫)
六、plugin.xml
文件結(jié)構(gòu)
plugin.xml
是編寫的插件的描述文件,其中主要是若干個 <platform>
標(biāo)簽中的內(nèi)容。根據(jù)不同的平臺,提供不同的設(shè)置。在執(zhí)行 cordova plugin add
命令時,會把不同平臺的配置,分別插入到“各個平臺工程代碼”中的 config.xml
中。
例如:
<!-- ios -->
<platform name="ios">
<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
<config-file target="config.xml" parent="/*">
<feature name="InAppBrowser">
<param name="ios-package" value="CDVInAppBrowser" />
</feature>
</config-file>
<header-file src="src/ios/CDVInAppBrowser.h" />
<source-file src="src/ios/CDVInAppBrowser.m" />
<framework src="CoreGraphics.framework" />
</platform>
<platform>
標(biāo)簽中
-
<config-file>
標(biāo)簽用于指定將里面<feature>
標(biāo)簽中的內(nèi)容插入到config.xml
中。 -
<js-module>
標(biāo)簽用于生成cordova_plugins.js
的內(nèi)容 -
<header-file>
、<source-file>
、<framework>
分別表示頭文件、實現(xiàn)文件和需要引用的 framework。
<platform>
標(biāo)簽中的內(nèi)容并不是所有平臺都一樣,而是根據(jù)平臺特性,自行定義。
以下為 InAppBrowser 插件的 Android 和 iOS 部分配置
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="cordova-plugin-inappbrowser"
version="1.6.1">
<name>InAppBrowser</name>
<description>Cordova InAppBrowser Plugin</description>
<license>Apache 2.0</license>
<keywords>cordova,in,app,browser,inappbrowser</keywords>
<repo>https://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser.git</repo>
<issue>https://issues.apache.org/jira/browse/CB/component/12320641</issue>
<engines>
<engine name="cordova" version=">=3.1.0" /><!-- Needs cordova/urlutil -->
</engines>
<!-- android -->
<platform name="android">
<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
<config-file target="res/xml/config.xml" parent="/*">
<feature name="InAppBrowser">
<param name="android-package" value="org.apache.cordova.inappbrowser.InAppBrowser"/>
</feature>
</config-file>
<source-file src="src/android/InAppBrowser.java" target-dir="src/org/apache/cordova/inappbrowser" />
<source-file src="src/android/InAppBrowserDialog.java" target-dir="src/org/apache/cordova/inappbrowser" />
<source-file src="src/android/InAppChromeClient.java" target-dir="src/org/apache/cordova/inappbrowser" />
<!-- drawable src/android/resources -->
<resource-file src="src/android/res/drawable-hdpi/ic_action_next_item.png" target="res/drawable-hdpi/ic_action_next_item.png" />
<resource-file src="src/android/res/drawable-mdpi/ic_action_next_item.png" target="res/drawable-mdpi/ic_action_next_item.png" />
<resource-file src="src/android/res/drawable-xhdpi/ic_action_next_item.png" target="res/drawable-xhdpi/ic_action_next_item.png" />
<resource-file src="src/android/res/drawable-xxhdpi/ic_action_next_item.png" target="res/drawable-xxhdpi/ic_action_next_item.png" />
<resource-file src="src/android/res/drawable-hdpi/ic_action_previous_item.png" target="res/drawable-hdpi/ic_action_previous_item.png" />
<resource-file src="src/android/res/drawable-mdpi/ic_action_previous_item.png" target="res/drawable-mdpi/ic_action_previous_item.png" />
<resource-file src="src/android/res/drawable-xhdpi/ic_action_previous_item.png" target="res/drawable-xhdpi/ic_action_previous_item.png" />
<resource-file src="src/android/res/drawable-xxhdpi/ic_action_previous_item.png" target="res/drawable-xxhdpi/ic_action_previous_item.png" />
<resource-file src="src/android/res/drawable-hdpi/ic_action_remove.png" target="res/drawable-hdpi/ic_action_remove.png" />
<resource-file src="src/android/res/drawable-mdpi/ic_action_remove.png" target="res/drawable-mdpi/ic_action_remove.png" />
<resource-file src="src/android/res/drawable-xhdpi/ic_action_remove.png" target="res/drawable-xhdpi/ic_action_remove.png" />
<resource-file src="src/android/res/drawable-xxhdpi/ic_action_remove.png" target="res/drawable-xxhdpi/ic_action_remove.png" />
</platform>
<!-- ios -->
<platform name="ios">
<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
<config-file target="config.xml" parent="/*">
<feature name="InAppBrowser">
<param name="ios-package" value="CDVInAppBrowser" />
</feature>
</config-file>
<header-file src="src/ios/CDVInAppBrowser.h" />
<source-file src="src/ios/CDVInAppBrowser.m" />
<framework src="CoreGraphics.framework" />
</platform>
<!-- osx -->
<platform name="osx">
<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
<config-file target="config.xml" parent="/*">
<feature name="InAppBrowser">
<param name="osx-package" value="CDVInAppBrowser" />
</feature>
</config-file>
<header-file src="src/osx/CDVInAppBrowser.h" />
<source-file src="src/osx/CDVInAppBrowser.m" />
</platform>
<!-- browser -->
<platform name="browser">
<js-module src="www/inappbrowser.js" name="inappbrowser">
<clobbers target="cordova.InAppBrowser.open" />
<clobbers target="window.open" />
</js-module>
<js-module src="src/browser/InAppBrowserProxy.js" name="InAppBrowserProxy">
<merges target="" />
</js-module>
</platform>
</plugin>