【问题标题】:VanillaJS - Why is import/export of this JS class not working? [duplicate]VanillaJS - 为什么这个 JS 类的导入/导出不起作用? [复制]
【发布时间】:2019-11-19 07:29:10
【问题描述】:

我正在尝试从文件“paddle.js”中导入一个 JS 类,以便在另一个文件“game.js”中使用(没有使用 JS 库或框架,只是纯简单的 VanillaJS),但我不能似乎弄清楚为什么这个导入/导出不起作用。我已经看过太多这方面的示例和教程,而且我正在按照他们所说的那样做,但是它不起作用。这可能是一个愚蠢的问题,但任何帮助表示赞赏。

这是来自我正在关注的 YT 教程,我基本上只是采用在 paddle.js 顶部添加“导出默认类 Paddle”的方法,并包括一个导入语句,如“import Paddle”来自'./paddle'",在 game.js 中。然后在 game.js 文件中实例化该类。但它不起作用。 我已经尝试过所有组合,例如:

import Paddle from 'paddle'
import Paddle from './paddle'
import Paddle from '/paddle'
import Paddle from 'paddle.js'
import Paddle from './paddle.js'

它们都不起作用。

// File: paddle.js
export default class Paddle{
  constructor(gameWidth, gameHeight){
     // some code
  }

  draw(ctx){
    // a function in this class
  }
}


// file: game.js

import Paddle from './paddle.js';
//var Paddle = require('paddle'); this doesn't work either


let c = document.getElementById("gameScreen");
let ctx = c.getContext("2d");

ctx.fillRect(20, 20, 100, 100); // would print a rectangle as a test

const GAME_WIDTH = 800;
const GAME_HEIGHT= 600;

//ctx.clearRect(0, 0, 800, 600);

let paddle = new Paddle(GAME_WIDTH, GAME_HEIGHT); // instantiating Paddle

paddle.draw(ctx);

// end

预计会成功实例化 paddle 类,并在我的 html5 画布上绘制一个 paddle。但相反,在开头包含 import 语句会导致文件根本无法运行,即我的画布是空的。

编辑(根据一些观众的要求): // 这是我的 js_game.html

<!DOCTYPE html>
<html lang="en">
    <head>
      <meta charset="utf-8">
      <title>VanillaJS game</title>
      <link rel="stylesheet" type="text/css" href="game.css">
    </head>
    <body>
      <canvas id="gameScreen" width="800" height="600">

      </canvas>
      <script src="game.js" type="text/javascript"></script>
      <!-- <script src="paddle.js"></script> -->

    </body>
</html>

【问题讨论】:

  • 你的文件夹结构是什么?可以贴在这里吗?
  • 你把 type='module' 放到 paddle.js 的链接里了吗?
  • 您是否遇到任何错误?您如何在您的网站中包含game.js?你的项目结构是什么?
  • @llievredemars 我只是确保文件夹不会引起任何争议,所以我只是转移了同一文件夹下的所有文件。并从 import 语句中删除了 VanillaJS 数据路径。所以我确信这不会造成任何问题。

标签: javascript


【解决方案1】:

我认为这是因为您使用 ES6 语法,但可能没有 Babel 为您转译它。在这种情况下,如果你不想配置 Babel(虽然你应该使用 ES6,它是更新的),你应该使用 module.exports = Paddle 导出你的 Paddle,然后在你的 game.js 中你应该使用 var Paddle = require('./paddle')

【讨论】:

  • 我刚刚试过了,它也不起作用。我只是很惊讶为什么这些简单明了的东西不起作用。除非我只是在 game.js 文件本身中包含 paddle 的类代码。它会这样工作,但它只是一个乱七八糟的代码。
  • 浏览器环境中没有module.exportsrequire
  • @Bergi 因为浏览器环境中不存在module.exports,您有建议的解决方案吗?我很好奇自己如何完成这项工作。谢谢。
  • @PA-GW 查看副本了解如何使用对 ES6 模块的原生浏览器支持。或者,使用模块加载器库和转译器。
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2020-04-16
  • 2020-10-01
相关资源
最近更新 更多