Невозможно получить доступ kotlin js от javascript - PullRequest
2 голосов
/ 18 марта 2020

У меня проблема с тем, что я не могу вызвать какую-либо функцию kotlin js, и получение 'что-то' не определено.

Я пытался скомпилировать проект с gradle, но закончил следовать этому уроку и компилировать с npm. Я приложил свой проект здесь

РЕДАКТИРОВАТЬ: протестировано с Maven и работал. Однако, поскольку maven устарел, я хотел бы использовать gradle или npm.

html код:

<body>
<script src="test.js"></script> //file generated in bin/bundle
<script>
    (function() {
        let a = new test.Test(); //test - module, Test - my class, error occurrs at this line
        a.test(); //test - method in class Test
    })()
</script>
</body>

однако это всегда приводит к

Uncaught ReferenceError: test is not defined

пакет. json:

{
  "name": "test",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "build": "shx rm -rf bin && webpack && shx rm -rf bin/build/kotlin-test*",
    "test": "mocha bin/test"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "kotlin": "^1.3.70"
  },
  "devDependencies": {
    "@jetbrains/kotlin-webpack-plugin": "^3.0.2",
    "kotlin-test": "^1.3.70",
    "mocha": "^7.1.0",
    "shx": "^0.3.2",
    "webpack": "^4.42.0",
    "webpack-cli": "^3.3.11"
  },
  "description": ""
}

webpack.config. js:

const KotlinWebpackPlugin = require('@jetbrains/kotlin-webpack-plugin');

module.exports = {
    entry: 'test', // This tells webpack where to begin for bundling

    resolve: {
        modules: ['bin/build', 'node_modules'], // Webpack will use this to look for anything that is required
    },

    output: {
        path: __dirname + '/bin/bundle', // This is where the bundle will go
        filename: 'test.js', // The bundle will be called vectron.js
    },

    plugins: [
        //Step one - Create a test build
        new KotlinWebpackPlugin({
            src: __dirname,                                   // Build Everything
            output: 'bin/test',                               // Output to bin/test
            moduleName: 'test',                            // Will create vectron.js
            moduleKind: 'commonjs',                           // Create commonjs modules
            librariesAutoLookup: true,                        // Uses node_modules for libraries
            packagesContents: [require('./package.json')],    // Points to package.json for dependencies
        }),
        // Step two - Create a production build
        new KotlinWebpackPlugin({
            src: __dirname + '/src',                          // Build only what is in src
            output: 'bin/build',                              // Output to bin/build
            moduleName: 'test',                            // Create a file called vectron.js
            moduleKind: 'commonjs',                           // Create commonjs modules
            metaInfo: true,                                   // Include .meta.js files
            sourceMaps: true,                                 // Include Source mappings
            librariesAutoLookup: true,                        // Uses node_modules for libraries
            packagesContents: [require('./package.json')],    // Points to package.json for dependencies
        }),
    ],
};

мой класс:

class Test {

    fun test() {
        println("test")
    }
}

РЕДАКТИРОВАТЬ: npm составление теста. js:

(function (_, Kotlin) {
  'use strict';
  var println = Kotlin.kotlin.io.println_s8jyv4$;
  var Kind_CLASS = Kotlin.Kind.CLASS;
  function Test() {
  }
  Test.prototype.test = function () {
    println('test');
  };
  Test.$metadata$ = {
    kind: Kind_CLASS,
    simpleName: 'Test',
    interfaces: []
  };
  _.Test = Test;
  Kotlin.defineModule('test', _);
  return _;
}(module.exports, require('kotlin'))); //error: module is not defined

//# sourceMappingURL=test.js.map

maven kotlin плагин вывода теста. js:

if (typeof kotlin === 'undefined') {
  throw new Error("Error loading module 'test'. Its dependency 'kotlin' was not found. Please, check whether 'kotlin' is loaded prior to 'test'.");
}var test = function (_, Kotlin) {
  'use strict';
  var println = Kotlin.kotlin.io.println_s8jyv4$;
  var Kind_CLASS = Kotlin.Kind.CLASS;
  function Test() {
  }
  Test.prototype.test = function () {
    println('test');
  };
  Test.$metadata$ = {
    kind: Kind_CLASS,
    simpleName: 'Test',
    interfaces: []
  };
  _.Test = Test;
  Kotlin.defineModule('test', _);
  return _;
}(typeof test === 'undefined' ? {} : test, kotlin);

1 Ответ

0 голосов
/ 18 марта 2020

moduleKind был неправильным в build.gradle. Установка его в «обычный» исправила проблему. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...