【问题标题】:How do I create a sourcemap for each individual js file with grunt-contrib-concat and grunt-contrib-uglify?如何使用 grunt-contrib-concat 和 grunt-contrib-uglify 为每个单独的 js 文件创建源映射?
【发布时间】:2018-08-11 03:55:45
【问题描述】:

目前,concat 和 uglify 设置为:

concat: {
  options: {
    // options
  },
  angular: {
    src: ['public/**/*.js', '!public/**/*.min.js', '!public/lib/**/*.js'],
    dest: 'build/_main.js',
  }
},

uglify: {
  options: {
    mangle: false,
    sourceMap: true,
  },
  app: {
    files: {
      'public/js/app.min.js': ['build/_main.js']
    }
  },
  bower: {
    files: {
      'public/js/lib.min.js': ['build/_bower.js']
    }
  }
},

这将在 Sources 下的开发工具中创建一个源映射。这个源映射是可用的,但我宁愿能够逐个文件搜索并浏览开发工具中的每个文件。如果整个项目目录和文件结构都被保留下来就好了,这样我就可以搜索和浏览每个文件并添加调试器等。

我该怎么做?

【问题讨论】:

    标签: gruntjs source-maps grunt-contrib-uglify grunt-contrib-concat


    【解决方案1】:

    这可以通过如下配置任务来实现:

    注意:以下两种解决方案都要求concat 任务在uglify 任务之前运行。


    1。为源映射使用默认生成的名称:

    concat: {
      options: {
        sourceMap: true // <-- 1. Enable source maps
      },
      angular: {
        src: ['public/**/*.js', '!public/**/*.min.js', '!public/lib/**/*.js'],
        dest: 'build/_tsbc.js',
      }
    },
    
    uglify: {
      options: {
        mangle: false,
        sourceMap: true,
        sourceMapIn: './build/_tsbc.js.map' // <-- 2. Define .map file to use.
      },
      app: {
        files: {
          'public/js/app.min.js': ['build/_tsbc.js']
        }
      },
      // ...
    } 
    

    说明

    1. 在您的concat 任务中,您需要首先将sourceMap 选项设置为true。鉴于您当前的配置,这将在以下路径创建一个源映射文件:

      build/_tsbc.js.map

      注意:生成的地图文件的位置默认为与concat 任务的angular 目标中定义的相同dest 路径 - 附加了额外的.map 后缀。

    2. 然后在您的uglify 任务中添加sourceMapIn 选项并将其值(字符串)设置为在上述第一阶段生成的.map 文件的路径。即

      sourceMapIn: './build/_tsbc.js.map'
      

    2。为源映射明确定义的名称:

    还可以为concat 任务生成的源映射文件定义特定的名称和路径。例如:

    concat: {
      options: {
        sourceMap: true,  // <-- 1. Enable source maps
        sourceMapName: 'build/my_map.map'  // <-- 2. Specify output path
      },
      angular: {
        src: ['public/**/*.js', '!public/**/*.min.js', '!public/lib/**/*.js'],
        dest: 'build/_tsbc.js',
      }
    },
    
    uglify: {
      options: {
        mangle: false,
        sourceMap: true,
        sourceMapIn: './build/my_map.map'  // <-- 3. Define .map file to use.
      },
      app: {
        files: {
          'public/js/app.min.js': ['build/_tsbc.js']
        }
      },
      // ...
    } 
    

    说明

    1. 和之前一样,将sourceMap选项设置为true

    2. 这一次,添加sourceMapName 选项并指定生成的源映射的路径。

      注意:生成的地图文件的位置现在设置为:

      'build/my_map.map'

    3. 同样,在您的uglify 任务中添加sourceMapIn 选项并将其值设置为与上一点中指定的相同路径。即

      sourceMapIn: './build/my_map.map'
      

    编辑

    我刚刚注意到uglify 任务中的bower 目标不依赖于先前concat 任务的输出。对于这种情况,您需要在每个目标中嵌套 options 对象。例如:

    uglify: {
      app: {
        options: {  // <-- Specific options for `app` target 
          mangle: false,
          sourceMap: true,
          sourceMapIn: './build/my_map.map'  // <-- 3. Define .map file to use.
        },
        files: {
          'public/js/app.min.js': ['build/_tsbc.js']
        }
      },
      bower: {
        options: {  // <-- Specific options for `bower` target 
          mangle: false,
          sourceMap: true
          // <-- There's no `sourceMapIn` needed here.
        },
        files: {
          'public/js/lib.min.js': ['build/_bower.js']
        }
      }
    },
    

    【讨论】:

    • 真正有力的解释。我之前使用您的第一个解决方案最终弄清楚了,但您肯定解释得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2013-06-21
    • 2014-10-19
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多