如何在Webpack中使用生成的JS文件(从Typescript生成)中的类?

krcsximq  于 2023-06-23  发布在  Webpack
关注(0)|答案(2)|浏览(165)

我正在做一些Typescript项目,其输出(JS)将用于JavaScript项目(如插件)。像这样:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. </head>
  6. <body>
  7. <script src="../dist/bundled.js"></script>
  8. <script>
  9. new TheClass()
  10. </script>
  11. </body>
  12. </html>

TheClass定义在Typescript文件中,该文件由Webpack转换为JavaScript(bundled.js)。tsconfig.js中的targetES5module项设置为ES6
现在,它抛出这个错误:Uncaught ReferenceError: TheClass is not defined.
因此,我尝试在webpack.config.js的输出部分添加库选项:

  1. const path = require("path")
  2. module.exports = {
  3. mode: "development",
  4. entry: "./src/main.ts",
  5. devtool: "inline-source-map",
  6. module: {
  7. rules: [
  8. {
  9. test: /\.tsx?$/,
  10. include: path.resolve(__dirname, "src"),
  11. use: "ts-loader",
  12. exclude: /node_modules/,
  13. },
  14. ],
  15. },
  16. resolve: {
  17. extensions: [".tsx", ".ts", ".js"],
  18. },
  19. output: {
  20. libraryTarget: 'umd', ///////////////////////////////// added this.
  21. library: 'MyLibrary', ///////////////////////////////// added this.
  22. filename: "bundled.js",
  23. path: path.resolve(__dirname, "dist"),
  24. },
  25. }

现在我可以像这样访问类:

  1. new MyLibrary.TheClass()

我还需要提到的是,类是这样定义的(它是导出的):

  1. export class TheClass {}

好了,现在有三个问题:
1.还有别的办法吗?
1.如何访问类,如:TheClass()(而不是MyLibrary.TheClass()

  1. libraryTarget: 'umd'有什么帮助?
    我也试过export default
  1. export default class TheClass {}

所以,我可以像这样使用这个类:

  1. new MyLibrary()

没成功

kq4fsx7k

kq4fsx7k1#

问得好以下是根据我所知道的每个问题的答案:
还有别的办法吗?
不,我认为这是将您的模块代码导出到外部库的唯一方法。
如何访问类,如:TheClass()(而不是MyLibrary. TheClass())
您可以查看windowglobal类型,网址为www.example.com,这可能适用于您的案例:https://webpack.js.org/configuration/output/#type-window which is likely to work for your case:

  1. library: {
  2. name: 'TheClass',
  3. type: 'window', // or `global`
  4. },

libraryTarget是如何做到的:帮我?
umd是一个建议的模块,它被设计用于许多环境,如浏览器和节点,因此它应该作为模块在两个env上工作

x3naxklr

x3naxklr2#

找到了!我改了这个:

  1. libraryTarget: 'umd',
  2. library: 'MyLibrary',

变成这样:

  1. libraryExport: 'default',
  2. library: 'TheClass',

我还在Typescript文件中使用了export default:

  1. export default class TheClass {}

现在,我可以做我想做的事:

  1. new TheClass()

尽管从逻辑上讲,我们的库的名称必须与我们的类的名称相同。所以,如果你改变了你的类名,记住也要改变库的名字。
如果有人知道如何防止库和类名之间的冲突,请对这个答案发表评论或给我发消息。谢谢

展开查看全部

相关问题