【问题标题】:Grunt babel multiple files and preserve source mappingGrunt babel 多个文件并保留源映射
【发布时间】:2015-12-10 19:46:44
【问题描述】:

我正在尝试使用 grunt 和 babel 将文件夹中的所有 js6 文件转换为原始 es6 文件的连接单个文件 (js5) 和工作源映射。但是源映射不起作用。我的 babel,concat 设置如下:

 "babel": {
        options: {
            sourceMap : true
        },
        dist: {
            files:[
                {
                    expand: true,
                    cwd: 'wwwroot/js/src',
                    src: ['*.js'],
                    dest: 'tmp/js'
                }]
        }
    },

    concat: {
        options: {
            sourceMap: true
        },
        js: {
            src: [
              'tmp/js/*.js',
            ],
            dest: 'wwwroot/js/app.js'
        }
    }

Versions:
"grunt": "0.4.5",
"grunt-bower-task": "0.4.0",
"grunt-babel": "5.0.1",
"grunt-contrib-concat" : "0.5.1"

我首先得到一个包含大量 js 文件和 src 映射(tmp 目录)的文件夹。但是将它们连接到一个文件中会完全搞乱源映射。

想法?另外,我可以以某种方式跳过临时文件的制作并将结果通过管道传输到 concat 中吗?

【问题讨论】:

  • 您可以先运行 concat 任务,然后在单个文件上运行带有源映射选项 true 的 babel 任务
  • @PrayagVerma 确实使它更好一点,因为我可以调试 es6 代码。不是来自原始文件,但更好。
  • babel 似乎有一个 inputSourceMap 选项,但让它工作对我来说似乎并不容易。
  • @PrayagVerma 很好,但是当 Babel 遇到错误时,它不会显示它的原始源位置,而是在连接文件中。有谁知道如何解决这个问题?

标签: javascript gruntjs grunt-contrib-concat grunt-babel


【解决方案1】:

颠倒任务顺序会更容易。首先在 JS 文件上运行concat 任务。之后在 concat 任务之前创建的单个文件上运行 babel 任务,使用以下选项

options: {
                sourceMap: true,
                inputSourceMap: grunt.file.readJSON('script.js.map')
            },

这里的script.js.map文件是concat任务生成的源映射文件的名称。由于inputSourceMap 选项不包括源映射对象,我们使用grunt.file API 的readJSON 方法将其传递

完整的 Grunt 文件配置为:

concat: {
        options: {
            sourceMap: true
        },
        js: {
            src: ['Modules/**/js/*.js'],
            dest: 'script.js'
        }
    },
    babel: {
        dist: {
            options: {
                sourceMap: true,
                inputSourceMap: grunt.file.readJSON('script.js.map')
            },
            src: [
                'script.js',
            ],
            dest: 'app.js'
        }
    }

示例项目:https://github.com/pra85/Grunt-Concat-Babel-Example

【讨论】:

  • 这行得通,谢谢。为了让它在 Visual Studio 任务运行器中工作,我必须做的是改变: inputSourceMap: function () { if (grunt.file.exists('../concatinated-es6.js.map')) { return grunt. file.readJSON('concatinated-es6.js.map') } return ''; }() 否则任务列表会崩溃。
  • 这通常有效,但 Grunt 文件在生成之前一直尝试读取源映射。为了解决这个问题,我注册了一个在 concat 和 babel 之间运行的自定义任务,它将 inputSourceMap 选项添加到 babel 配置中。让我的 Gruntfile.js 看起来像这样:jsbin.com/rijazetaxe/3/edit?js
  • 根据babel source code,不需要解析源地图json。只要inputSourceMap 是真实的,Babel 总是会解析来自 concat 输出的源映射注释。更糟糕的是,如果它找到源映射注释,它将忽略任何值,这里总是如此。因此,这可能不会达到您的预期。
  • 终于真正解决了问题。许多其他 grunt 插件都有一个选项sourceMapIn,您可以将路径传递给该选项,但此插件需要一个没有更好指定的“源映射对象”。在这里。
  • 对我来说,这会导致内存不足错误,因为我的源映射很大。节点选项 --max-old-space-size=10000 有帮助。 stackoverflow.com/questions/53299430/…
猜你喜欢
  • 2019-03-24
  • 1970-01-01
  • 2016-04-24
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2014-10-19
相关资源
最近更新 更多