Browserify 和 Babelify 给出 {classname} is not defined 错误

Browserify and Babelify give {classname} is not defined error

鉴于此 TS 文件:

export default class Rob {
    Start(): void {
        console.log("Hello, world!");
    }
}

我正在使用如下所示的 G运行t 任务进行转换:

browserify: {
    rob: {
        src: "./rob/rob.js",
        dest: "./wwwroot/rob.js",
        options: {
            transform: [["babelify", { "presets": ["@babel/preset-env"] }]]
        }
    }
}

我运行一个像这样的简单HTML文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Test bed</title>
    <script src="rob.js"></script>
    <script>
        window.addEventListener("DOMContentLoaded", function () {
            var r = new Rob();
            r.Start();
        });
    </script>
</head>
<body>
    <p>Hello, world!</p>
</body>
</html>

这导致 Uncaught ReferenceError: Rob is not defined

我在 SO 上看到过几个这样的问题,但这些问题似乎与上下文的误用有关(例如,在不合适的情况下不这样做或不这样做)。这里上下文无关紧要;我只想在控制台中看到我的 console.log。

我的 package.json 看起来像这样:

{
  "version": "1.0.0",
  "name": "robtest",
  "private": true,
  "devDependencies": {
      "@babel/core": "7.9.6",
      "@babel/preset-env": "7.9.6",
      "babel-preset-es2015": "7.0.0-beta.3",
      "babelify": "10.0.0",
      "grunt": "^1.1.0",
      "grunt-browserify": "5.3.0"
  }
}

我去过

这会输出一个 JS 文件,在我看来是我想要的,包括这个片段:

var Rob = /*#__PURE__*/function () {
  function Rob() {
    _classCallCheck(this, Rob);
  }

  _createClass(Rob, [{
    key: "Start",
    value: function Start() {
      console.log("Hello, world!");
    }
  }]);

  return Rob;
}();

exports["default"] = Rob;

Chrome 还告诉我 rob.js 加载正常,当 HTML 页面加载后,我可以在源资源管理器中看到内容。

我的问题很简单:为什么在这个实例中引用错误?

编辑:作为对已接受答案的一点补充: 如果我编辑 ts 来调用它自己(作为它自己的入口点):

export default class Rob {
    Start(): void {
        console.log("Hello, world!");
    }
}
const r = new Rob();
r.Start();

然后一切 运行 都是它应该做的 - 这非常适合我的用例。

如果您观察整个输出文件 rob.js,您会注意到它实际上是一个 IIFE。这意味着 rob.js 中的所有内容都不会对 "outside world" 可见。您不能以这种方式与它互动。

您可以在 "pre-compile" 阶段用打字稿编写整个逻辑,或者您可以使用支持创作库的不同捆绑系统,例如 webpack