Không còn native
từ khóa nữa, có chú thích @native
. Hiện tại, nó là giải pháp làm việc và bạn có thể sử dụng nó với nhánh 1.0.x của trình biên dịch Kotlin. Tuy nhiên, chúng tôi sẽ ngừng sử dụng chú thích này để ủng hộ các chú thích extern
, vì vậy hãy chuẩn bị để viết lại mã của bạn cuối cùng cho chi nhánh 1.1.x.
Khi bạn đặt @native
chú thích trên một lớp học hoặc trên một hàm cấp cao nhất, có hai điều xảy ra:
- cơ thể của nó không được biên dịch JavaScript.
- Trình biên dịch tham chiếu lớp hoặc chức năng này trực tiếp, không có tên gói và mangling.
Tôi nghĩ rằng nó dễ dàng hơn để giải thích bằng cách cung cấp ví dụ về một thư viện JavaScript:
function A(x) {
this.x = x;
this.y = 0;
}
A.prototype.foo = function(z) {
return this.x + this.y + z;
}
function min(a, b) {
return a < b ? a : b;
}
và tuyên bố Kotlin tương ứng
@native class A(val x: Int) {
var y: Int = noImpl
fun foo(z: Int): Int = noImpl
}
@native fun min(a: Int, b: Int): Int = noImpl
Lưu ý rằng noImpl
là một giữ chỗ đặc biệt đó là cần thiết vì các hàm không trừu tượng bắt buộc các đối tượng và các thuộc tính không trừu tượng yêu cầu khởi tạo. BTW, khi chúng tôi thay thế @native
bằng extern
, chúng tôi sẽ loại bỏ điều này noImpl
.
Một khía cạnh khác của tương tác với các thư viện JS là bao gồm thư viện thông qua hệ thống mô-đun. Xin lỗi, chúng tôi không có bất kỳ giải pháp nào ngay bây giờ (nhưng sẽ sớm phát hành). Xem proposal. Bạn có thể sử dụng workaround sau cho Node.js/CommonJS:
@native interface ExternalModule {
fun foo(x: Int)
}
@native fun require(name: String): dynamic = noImpl
fun main(args: Array<String>) {
val module: ExternalModule = require("externalModule")
module.foo(123)
}
nơi mô-đun bên ngoài được khai báo như thế này
function foo(x) {
return x + 1;
}
module.exports = { foo : foo };
Nguồn
2016-09-20 11:40:26
Địa điểm có thể là điểm bắt đầu tốt để đọc: https://discuss.kotlinlang.org/c/javascript, kênh Kotlin Slack #javascript và câu hỏi SO khác http://stackoverflow.com/questions/36250680/ viết-javascript-ứng dụng-với-kotlin –