在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Kotlin JavaScript模塊
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫(xiě)Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見(jiàn)性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語(yǔ)法
使用Kotlin進(jìn)行服務(wù)器端開(kāi)發(fā)
Kotlin接口
Kotlin反射
Kotlin類(lèi)型別名
Kotlin枚舉類(lèi)
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類(lèi)型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類(lèi)型安全的構(gòu)建器
Kotlin相比Java語(yǔ)言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語(yǔ)法
Kotlin與OSGi
Kotlin數(shù)據(jù)類(lèi)型
Kotlin是面向?qū)ο筮€是函數(shù)式語(yǔ)言?
Kotlin動(dòng)態(tài)類(lèi)型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類(lèi)
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開(kāi)發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類(lèi)
Kotlin控制流程
Kotlin和Java語(yǔ)言比較
Kotlin 與 Java 語(yǔ)言兼容嗎?
Kotlin教程
Kotlin類(lèi)和繼承
Kotlin對(duì)象表達(dá)式和對(duì)象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類(lèi)
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開(kāi)發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開(kāi)發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin JavaScript模塊

Kotlin 允許你將 Kotlin 項(xiàng)目編譯為熱門(mén)模塊系統(tǒng)的 JavaScript 模塊。以下是
可用選項(xiàng)的列表:

  1. 無(wú)模塊(Plain)。不為任何模塊系統(tǒng)編譯。像往常一樣,你可以在全局作用域中以其名稱(chēng)訪問(wèn)模塊。
    默認(rèn)使用此選項(xiàng)。
  2. 異步模塊定義(AMD,Asynchronous Module Definition),它尤其為
    require.js 庫(kù)所使用。
  3. CommonJS 約定,廣泛用于 node.js/npm
    (require 函數(shù)和 module.exports 對(duì)象)
  4. 統(tǒng)一模塊定義(UMD,Unified Module Definitions),它與 AMDCommonJS 兼容,
    并且當(dāng)在運(yùn)行時(shí) AMDCommonJS 都不可用時(shí),作為“plain”使用。

選擇目標(biāo)模塊系統(tǒng)

選擇目標(biāo)模塊系統(tǒng)的方式取決于你的構(gòu)建環(huán)境:

在 IntelliJ IDEA 中

設(shè)置每個(gè)模塊:
打開(kāi)“File → Project Structure…”,在“Modules”中找到你的模塊并選擇其下的“Kotlin”facet。在
“Module kind”字段中選擇合適的模塊系統(tǒng)。

為整個(gè)項(xiàng)目設(shè)置:
打開(kāi)“File → Settings”,選擇“Build, Execution, Deployment”→“Compiler”→“Kotlin compiler”。 在
“Module kind”字段中選擇合適的模塊系統(tǒng)。

在 Maven 中

要選擇通過(guò) Maven 編譯時(shí)的模塊系統(tǒng),你應(yīng)該設(shè)置 moduleKind 配置屬性,即你的
pom.xml 應(yīng)該看起來(lái)像這樣:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>
    <executions>
        <execution>
            <id>compile</id>
            <goals>
                <goal>js</goal>
            </goals>
        </execution>
    </executions>
    <!-- 插入這些行 -->
    <configuration>
        <moduleKind>commonjs</moduleKind>
    </configuration>
    <!-- 插入文本結(jié)束 -->
</plugin>

可用值包括:plain、 amd、 commonjsumd。

在 Gradle 中

要選擇通過(guò) Gradle 編譯時(shí)的模塊系統(tǒng),你應(yīng)該設(shè)置 moduleKind 屬性,即

compileKotlin2Js.kotlinOptions.moduleKind = "commonjs"

可用的值類(lèi)似于 Maven。

@JsModule 注解

要告訴 Kotlin 一個(gè) external 類(lèi)、 包、 函數(shù)或者屬性是一個(gè) JavaScript 模塊,你可以使用 @JsModule
注解??紤]你有以下 CommonJS 模塊叫“hello”:

module.exports.sayHello = function(name) { alert("Hello, " + name); }

你應(yīng)該在 Kotlin 中這樣聲明:

@JsModule("hello")
external fun sayHello(name: String)

@JsModule 應(yīng)用到包

一些 JavaScript 庫(kù)導(dǎo)出包(命名空間)而不是函數(shù)和類(lèi)。
從 JavaScript 角度講 它是一個(gè)具有一些成員的對(duì)象,這些成員類(lèi)、函數(shù)和屬性。
將這些包作為 Kotlin 對(duì)象導(dǎo)入通??雌饋?lái)不自然。
編譯器允許使用以下助記符將導(dǎo)入的 JavaScript 包映射到 Kotlin 包:

@file:JsModule("extModule")
package ext.jspackage.name

external fun foo()

external class C

其中相應(yīng)的 JavaScript 模塊的聲明如下:

module.exports = {
    foo:  { /* 此處一些代碼 */ },
    C:  { /* 此處一些代碼 */ }
}

重要提示:標(biāo)有 @file:JsModule 注解的文件無(wú)法聲明非外部成員。
下面的示例會(huì)產(chǎn)生編譯期錯(cuò)誤:

@file:JsModule("extModule")
package ext.jspackage.name

external fun foo()

fun bar() = "!" + foo() + "!" // 此處報(bào)錯(cuò)

導(dǎo)入更深的包層次結(jié)構(gòu)

在前文示例中,JavaScript 模塊導(dǎo)出單個(gè)包。
但是,一些 JavaScript 庫(kù)會(huì)從模塊中導(dǎo)出多個(gè)包。
Kotlin 也支持這種場(chǎng)景,盡管你必須為每個(gè)導(dǎo)入的包聲明一個(gè)新的 .kt 文件。

例如,讓我們的示例更復(fù)雜一些:

module.exports = {
    mylib: {
        pkg1: {
            foo: function() { /* 此處一些代碼 */ },
            bar: function() { /* 此處一些代碼 */ }
        },
        pkg2: {
            baz: function() { /* 此處一些代碼 */ }
        }
    }
}

要在 Kotlin 中導(dǎo)入該模塊,你必須編寫(xiě)兩個(gè) Kotlin 源文件:

@file:JsModule("extModule")
@file:JsQualifier("mylib.pkg1")
package extlib.pkg1

external fun foo()

external fun bar()

以及

@file:JsModule("extModule")
@file:JsQualifier("mylib.pkg2")
package extlib.pkg2

external fun baz()

@JsNonModule 注解

當(dāng)一個(gè)聲明具有 @JsModule、當(dāng)你并不把它編譯到一個(gè) JavaScript 模塊時(shí),你不能在 Kotlin 代碼中使用它。
通常,開(kāi)發(fā)人員將他們的庫(kù)既作為 JavaScript 模塊也作為可下載的.js 文件分發(fā),你可以將這些文件復(fù)制到
項(xiàng)目的靜態(tài)資源,并通過(guò) <script> 元素包含。 要告訴 Kotlin,可以
在非模塊環(huán)境中使用一個(gè) @JsModule 聲明,你應(yīng)該放置 @JsNonModule 聲明。例如,
給定 JavaScript 代碼:

function topLevelSayHello(name) { alert("Hello, " + name); }
if (module && module.exports) {
    module.exports = topLevelSayHello;
}

可以這樣描述:

@JsModule("hello")
@JsNonModule
@JsName("topLevelSayHello")
external fun sayHello(name: String)

備注

Kotlin 以 kotlin.js 標(biāo)準(zhǔn)庫(kù)作為單個(gè)文件分發(fā),該文件本身被編譯為 UMD 模塊,因此
你可以使用上述任何模塊系統(tǒng)。也可以在 NPM 上使用 kotlin