【问题标题】:Compiled JS from TypeScript does not run in browser从 TypeScript 编译的 JS 不能在浏览器中运行
【发布时间】:2020-01-23 07:37:02
【问题描述】:

TypeScript 代码可以正确编译。但是(可能)由于我的类结构最终编译的结果与预期的不同。导致运行时错误。

导致错误本身的实际问题是

this.Scene = new THREE.Scene();

运行 tsc 后我得到了这一行

this.Scene = new three_1.default.Scene();

我可以删除默认参数并修复它。但每次都这样做似乎是个坏主意。我宁愿知道根本问题。 上下文类,以防它与我正在使用的结构有关。 提前抱歉,我对 typescript 比较陌生(一周前开始使用 JS,但我确实拥有 .NET 学位)

import { MaterialLibrary } from "./Materials/MaterialLibrary";
import { MeshLoader } from "./MeshLoader";
import THREE from "three";

export class Manager
{
    //manager instance
    private static instance: Manager;

    //sub-managers
    public static MaterialLib: MaterialLibrary;
    public static Scene: THREE.Scene;

    //helper classes
    public static MeshLoader: MeshLoader;

    constructor()
    {
        Manager.instance = this;
    }

    static Init()
    {
        this.MaterialLib = new MaterialLibrary();
        this.MeshLoader = new MeshLoader();
        this.Scene = new THREE.Scene();
    }

    static GetInstance(): Manager
    {
        if(!Manager.instance)
        {
            Manager.instance = new Manager();
        }

        return Manager.instance;
    }
}

这编译成

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const MaterialLibrary_1 = require("./Materials/MaterialLibrary");
const MeshLoader_1 = require("./MeshLoader");
const three_1 = __importDefault(require("three"));
class Manager {
    constructor() {
        Manager.instance = this;
    }
    static Init() {
        this.MaterialLib = new MaterialLibrary_1.MaterialLibrary();
        this.MeshLoader = new MeshLoader_1.MeshLoader();
        this.Scene = new three_1.default.Scene();
    }
    static GetInstance() {
        if (!Manager.instance) {
            Manager.instance = new Manager();
        }
        return Manager.instance;
    }
}
exports.Manager = Manager;

【问题讨论】:

  • 为什么要使用不同的语法导入 THREE 和 Meshloader? THREE 是否定义了 __esModule?
  • 嗯,简单的答案是我相信 VS Code 能够正确解释导入语法。我不知道 THREE 是否定义了 __esModule。这就是 Typescript 转译器把它变成的......值得注意的是,虽然我的前 2 个导入是我编写的自定义类,而三个不直接在我的项目中。
  • 你使用的是 rollup 还是 webpack?
  • 我现在正在使用 browsify。

标签: typescript visual-studio-code three.js


【解决方案1】:

尝试使用

import * as THREE from 'three';

而不是

import THREE from 'three';

见:https://threejs.org/docs/index.html#manual/en/introduction/Import-via-modules

【讨论】:

  • 似乎我的打字稿编译器仍然对这个做同样的事情......奇怪,我认为这应该有不同的解释?
  • 是的,他们的工作确实不同。第一个将导入从模块“三”导出的所有内容并将其分配给变量三,第二个将仅导入在三模块中使用export default 导出的内容。不过,我对您的设置知之甚少,无法提供进一步帮助。
  • 我试着稍微简化一下我的代码,并首先在一个文件中重新编写了大部分代码,看看它是否有效,但 __esmodule 上有一个错误。 pastebin.com/WKqb8XiK 编译为 pastebin.com/07vfngAy 导致 Uncaught ReferenceError: exports is not defined at main.js:2.不确定这是否相关,或者我是否应该为此发一个新帖子
  • 我认为看看你的构建设置会更有趣。大多数这些问题都隐藏在 tsc、babel、browserify 和你使用的任何东西之间。源代码本身看起来不错。
猜你喜欢
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2012-10-24
  • 2018-04-10
  • 2020-10-24
  • 1970-01-01
  • 2021-12-31
  • 2015-03-28
相关资源
最近更新 更多