在 Typescript 中动态导入 JS 插件模块

时间:2021-07-01 08:46:05

标签: javascript typescript ecmascript-6

我正在为 Obsidian.md 创建一个插件。这个插件是用 Typescript 编写的,并使用以下 tsconfig.json 编译:

{
  "compilerOptions": {
    "baseUrl": ".",
    "inlineSourceMap": true,
    "inlineSources": true,
    "module": "ESNext",
    "target": "es6",
    "allowJs": true,
    "noImplicitAny": true,
    "moduleResolution": "node",
    "importHelpers": true,
    "lib": [
      "dom",
      "es5",
      "scripthost",
      "es2015"
    ]
  },
  "include": [
    "**/*.ts"
  ]
}

我做了一个单独的项目,并创建了一个简单的打字稿文件。我正在使用 laravel mix 独立进行捆绑。 webpack.mix.js 看起来像这样:

let mix = require('laravel-mix');

mix
    .ts('src/*.ts', 'dist')
    .setPublicPath('dist');

简单。

我的 src/plugin1.ts 看起来像这样:

// plugins/src/plugin1.ts

export default function foo() {
    console.log("Foo!");
}

这将编译为 dist/plugin1.js,如下所示:

/******/ (() => { // webpackBootstrap
/******/    "use strict";
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it uses a non-standard name for the exports (exports).
(() => {
var exports = __webpack_exports__;
/*!**********************!*\
  !*** ./src/test1.ts ***!
  \**********************/


Object.defineProperty(exports, "__esModule", ({
  value: true
}));

function foo() {
  console.log("Foo!");
}

exports.default = foo;
})();

/******/ })()
;

好的,现在回到 Obsidian.md 插件。在插件加载函数中,我有以下代码:

console.log(`Importing from: ${test1_path}`);
const im = await import(test1_path);
console.log(im);

哪里const test1_path: string = <the path to plugins/dist/plugin1.js

那么,我们在控制台得到如下输出:

Importing from: <the plugin folder>/dist/test1
main.ts:50 {default: {…}}

im 对象如下所示:

{"default":{}}

为什么?

我的foo去哪儿了?

谢谢,

0 个答案:

没有答案