【问题标题】:Using JavaScript NPM package with import使用带有导入的 JavaScript NPM 包
【发布时间】:2020-04-22 23:35:51
【问题描述】:

我正在使用 kahoot-api NPM 模块(GitHubNPM),它需要使用 JavaScript 导入。 (编辑,这是一个 Node.js 包。我在写这篇文章的时候还不知道 JS 和 Node.js 之间的区别,这就是创建这个问题的原因)。

文档说要使用以下 JavaScript 导入脚本来导入 SessionAdapters

import { Session, Adapters } from 'kahoot-api';

这会引发一个错误,提示我需要使用相对引用。

无法解析模块说明符“kahoot-api”。相对引用必须以“/”、“./”或“../”开头。

我的文件和文件夹的结构如下:

  • index.php
  • node_modules
    • @omegaboot
      • kahoot-api

kahoot-api 的所有 NPM 文件都在 kahoot-api 文件夹中。

我已修改我的 JavaScript 代码以使用相对引用,如下所示。

import { Session, Adapters } from './node_modules/@omegaboot/kahoot-api/';

没有抛出错误,但是两个导入的语句SessionAdapters 不可用,并且仍然未定义。

import { Session, Adapters } from './node_modules/@omegaboot/kahoot-api/';

const session = new Session('000000');
session.openSocket() //Connect
  .then(socket => {
    const player = new Adapters.Player(socket); //Create player class
    player.join('test') //Join with name
      .then(() => {
         console.log('Success!');
      });
  });

kahoot-api 文件夹中有多个 JavaScript 文件,我尝试在 JavaScript 导入中包含每个 JavaScript 文件,但无济于事。

另外,我根据需要使用index.php 中的代码和<script> 标记和属性type="module",否则会引发以下错误:

不能在模块外使用 import 语句

【问题讨论】:

  • 你在使用 webpack 吗?因为import语句在nodejs中不直接支持。
  • @ajitkumar 我不知道 webpack 是什么。我刚刚用 npm install 安装了 npm 包。
  • 如果你没有使用任何 js 打包器,那么你应该使用require('module-name') 而不是import 语句。
  • 我认为正确的导入语句应该是这样的:import { Session, Adapters } from '@omegaboot/kahoot-api';
  • @PatrickHund 这只会导致Failed to resolve module specifier "@omegaboot/kahoot-api". Relative references must start with either "/", "./", or "../".

标签: javascript node.js npm


【解决方案1】:

看起来该文档是错误的,因为它基于旧包。

你应该像这样安装它:

yarn add @omegaboot/kahoot-api

npm i @omegaboot/kahoot-api

如果你有 webpack(我看到你在 php 中使用它)然后使用 import

import { Session, Adapters } from '@omegaboot/kahoot-api';

否则使用要求

const { Session, Adapters } = require("@omegaboot/kahoot-api")

【讨论】:

  • 我在使用第一个示例时得到了Failed to resolve module specifier "@omegaboot/kahoot-api". Relative references must start with either "/", "./", or "../".
【解决方案2】:

当我尝试模块 @omegaboot/kahoot-api 时,这对我有用。

由于 nodejs 不支持 import 语句,如果你不使用任何捆绑器,则必须使用 require 方法。

const {
  Session,
  Adapters
} = require('@omegaboot/kahoot-api');

const session = new Session('000000');
session.openSocket() //Connect
  .then(socket => {
    const player = new Adapters.Player(socket); //Create player class
    player.join('test') //Join with name
      .then(() => {
        console.log('Success!');
      });
  });

【讨论】:

  • 我用 require.js 尝试了这个确切的东西(因为没有定义 require),它只是返回 null (eruda 这么说,我无法访问真正的控制台,eruda 只是一个移动控制台)
  • @4424dev 我已经编辑了我的答案,试试看。它必须有效。
  • 嗯,我认为这个模块是用于浏览器的,对吧?如果是这样,您必须使用 webpack 或其他支持 import 语句的打包程序。我尝试在 HTML 文件中构建和包含脚本,但由于在 test.omegaboot.com/kahoot 上为本地主机禁用了 CORS(跨源资源共享)。我认为这是您需要的。
  • "我尝试构建脚本并将其包含在 HTML 文件中,但由于在 test.omegaboot.com/kahoot 上禁用了 CORS(跨源资源共享),它显示错误 404(不是找到)”:编辑。
【解决方案3】:

idiidk here(包的作者)

@omegaboot/kahoot-api 不是人们应该使用的版本。这个包使用了一些硬编码的默认值,以便更容易地与我们为 omegaboot.com 的构建过程集成。

“正常”的 kahoot-api 包 https://www.npmjs.com/package/kahoot-api 将被第三方使用,尽管它还没有更新。如果有任何问题,请在 github 页面上打开一个问题,我一定会看看。

【讨论】:

  • 是的,我明白了。但是,我在普通 JavaScript 中使用它,所以这就是这些错误出现的原因。
猜你喜欢
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 2017-02-10
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2021-03-02
相关资源
最近更新 更多