【问题标题】:Issues with require.js and sourcemaps when compiling typescript with grunt-ts使用 grunt-ts 编译 typescript 时出现 require.js 和 sourcemaps 的问题
【发布时间】:2016-12-29 22:18:22
【问题描述】:

当使用grunt-ts 并指定和输出文件时,我的应用程序按预期运行,但由于该选项不支持快速编译,我尝试使用常规编译,其中我的所有.ts 文件都位于dist 文件夹中

有两个问题,首先,它将无法加载任何导入的文件,因为它会尝试在没有扩展名的情况下查找它。作为快速修复,我在 require.js 文件上编辑了load fn,并且我的所有依赖项都正确加载,但随后源映射停止工作,我得到的只是 chrome 检查器上的一个空白文件(当然我没有想依赖一个肮脏的黑客)。

请注意,我对 requirejs 不是很熟悉,所以我不太确定这是我这边的错误配置、错误还是缺少的东西。

我的 grunt 配置,与 ts 相关

ts: {
      options: {
        module: 'amd',
        target: 'es5',
        experimentalDecorators: true
      },
      dev: {
        src: ['client-app/**/*.ts'],
        outDir: "dist",
        watch: '.'
      }
    },

我的 bootstrap.js 只是入口点和 require.js 配置文件

requirejs.config({
  baseUrl: '.',
  waitSeconds: 20
});

requirejs(['/init'], function(module) {
  module.main()
});

编译后的init文件的简化版

define(["require", "exports", './section-manager.view'], function (require, exports, section_manager_view_1,) {
    "use strict";
    function main() {
        ///
    }
    exports.main = main;
});
//# sourceMappingURL=init.js.map

还有html

<script src="/js/lib/require.js" data-main="/bootstrap"></script>

感谢任何帮助,谢谢

编辑:

使用 System.js 或 @Luis 回答可以解决加载问题。 sourcemap 问题通过使用sourceRoot

解决
inlineSourceMap: true,
inlineSources: true

到 ts 选项

【问题讨论】:

  • 你可能想尝试一些适用于 commonjs 模块的东西,它会更容易。试试 Browserify、JSPM 或 Webpack。他们都有 TS 插件。
  • 你看到了什么错误?
  • @elclanrs 起初尝试使用 browserify,但我遇到了很多错误,因为我使用的是新的导入语法而不是节点语法
  • @randominstanceOfLivingThing 错误基本上是它没有加载文件,它抛出一个require.js:168 Uncaught Error: Script error for "/init",如果我检查网络选项卡,它没有添加.js,通过添加扩展名require.js 通过我之前说的 hack,它可以工作,但是它与源映射混淆
  • 当您为 typescript 编译器指定 amd 代码生成时,您在使用 requirejs 吗?我认为不需要使用 requirejs。

标签: javascript typescript gruntjs requirejs grunt-ts


【解决方案1】:

不要使用绝对的模块名称。如果您确实使用了绝对名称,RequireJS 假定您在从模块名称生成路径时不希望进行任何更改,并且将添加 .js 扩展名。您应该使用相对路径,或者您可以这样做:

requirejs.config({
    baseUrl: '/'
});

requirejs(['init'], function(module) {
  module.main()
});

通过这样做,RequireJS 会自动添加.js 扩展。

【讨论】:

  • 我也读过一些关于它的东西,但问题是(也许我应该说)这是我尝试的第一件事,但如果我这样做,那么 init.js甚至不加载。但是让我们再次检查确认
  • 好的,我刚刚检查过,但它不起作用,但如果我在该行之前附加requirejs.config({baseUrl: '/'});,以便我避免在第一次初始化时使用/,它会起作用。但是源映射不起作用,我刚刚尝试了 System.js,我得到了相同的结果,它可以工作,但是源映射似乎没有加载,有什么想法吗?
  • 是的,你必须使用baseUrl 和一个模块路径才能一起工作。你做什么来触发源地图的加载?当您触发加载源地图时,您看到哪些网络请求正在完成加载源地图?网络请求是否成功?它是在加载实际的源图吗?您应该使用此信息编辑您的问题。
  • 谢谢,我知道如何解决 sourceMap 问题,使用内联源映射或定义“sourceRoot”,请在您的代码中添加设置 baseUrl 的代码行,我会将其标记为已接受回答以供其他用户将来参考
猜你喜欢
  • 2014-04-05
  • 2015-04-27
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2021-06-16
相关资源
最近更新 更多