【问题标题】:Replace 'require' on Typescript bundle替换打字稿包上的“要求”
【发布时间】:2015-10-24 23:24:47
【问题描述】:

我有一个主要的 TypeScript 文件,其中导入到另一个文件,如下所示:

import './app.run';

我使用tsproject 将我的 ts 文件编译成一个包,然后在我的 html 页面中使用 System JS,如下所示:

System.import('app/app.module');

但在我的包中,所有文件导入都替换为 commonjs 要求语句,如下所示:

require('./app.run');

虽然不再存在 app.run 文件,因为所有内容都已捆绑在一起。如何在不导入外部文件的情况下正确捆绑 ts?

【问题讨论】:

    标签: typescript commonjs systemjs


    【解决方案1】:

    在最新版本的 TypeScript (which is 1.5 at the time of writing) 中,您将使用 ES6 样式的模块导入:

    import * as Alias from "./app.run";
    

    并使用 SystemJS 模块类型进行编译。

    tsc --module systemjs app.ts
    

    这应该是您想要的最简单的途径。 SystemJS 支持是 1.5 的全新支持。

    关于内部/外部模块的注意事项...

    关于内部和外部模块有很多混淆,但我(强烈)建议是you shouldn't mix internal and external modules

    内部模块背后的想法是模拟一种在编写 JavaScript 时使用的通用模式来隐藏信息,而不是将其放在全局范围内。道格·克罗克福德(Doug Crockford)对此进行了宣传。本质上,如果你有这个 JavaScript:

    var name = 'Nicky';
    function sayHello() {
        return 'Hello ' + name;
    }
    

    您可以将 namesayHello 移出全局范围,并将占用空间减少到单个变量:

    var myNamespace = (function() {
        var name = 'Nicky';
        return {
            sayHello: function () {
                return 'Hello ' + name;
            }
        };
    }());
    

    这是令人钦佩的,因为有可能另一个库会定义 namesayHello 并且最后加载的那个会获胜。

    对于外部模块,文件就是模块。这实际上比上面的命名空间示例要好一个,因为 nothing 最终会出现在全局范围内。当你加载一个模块时,你给它一个本地名称并且没有污染。因此,您不需要将外部模块组织成内部模块或命名空间。事实上,尝试这样做会使您的代码变得更糟,而不是更好。

    TypeScript 团队正在将内部模块重命名为“命名空间” - 请参阅 "Simplifying modules" in the TypeScript 1.5 release notes 下的注释。虽然这将解决“内部”或“外部”之间的混淆,但我认为它不会完全解决组合这两种模式的混淆。

    考虑到你的名声史蒂夫,我相信

    没有人的声誉意味着他们的话应该是无懈可击的 - 所以请使用您自己的经验来做出最终决定。在这种情况下,您应该从骨子里感觉到内部和外部模块的组合正在创建不舒服的代码而没有增加任何好处;但我可能是错的。

    【讨论】:

    • 我试过这个解决方案,但我的问题是app.run是一个TS模块,就像这样:module app.run { }。因此,当我使用 import as 语法时,我收到文件不是模块的错误。我可以像export module app.run { } 一样导出模块,但是我需要在使用该模块的所有其他文件上导入相对文件路径,这并不理想。有什么建议吗?
    • 不要使用内部模块。我知道这听起来很轻率 - 但我是认真的...stevefenton.co.uk/2015/05/…
    • 你的文章仍然没有解释清楚为什么不使用模块。我尝试阅读它并问自己是否可以说服另一个人不使用 TypeScript 模块。我还是不行。此外,我真的很想知道为什么仍然存在内部模块(关于您的文章)以及为什么我在 Pluralsight 上观看了关于如何在大型应用程序中使用它们的多小时系列文章。我真的很困惑!
    • 这篇文章特别关注避免混合内部和外部模块。甚至 TypeScript 团队也意识到存在混淆,内部模块将被替换为“命名空间”以减少混淆。如果您在代码中使用 import 语句,则您选择的是外部模块 - 因此请避免使用 module 关键字。
    • 考虑到史蒂夫的名声,我深信不疑。您是否介意回答原始问题,参考 TypeScript 团队的来源,认识到混淆(+未来计划改变这一点?)和您自己的文章?谢谢!
    猜你喜欢
    • 2012-11-03
    • 2017-05-08
    • 2014-01-25
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2016-01-28
    • 2021-06-14
    相关资源
    最近更新 更多