[英]How do I generate sourcemaps for Uglified files using Grunt?
我有一個同時使用 Browserify 和 Uglify 的 Grunt 項目。 以下是它的核心部分:
browserify: {
myapp: {
options: {
transform: ['babelify'],
browserifyOptions: {
debug: true
},
},
src: 'src/index.js',
dest: 'build/myapp.js'
}
},
uglify: {
options: {
sourceMap: true,
banner: bannerContent
},
target: {
src: 'build/myapp.js',
dest: 'build/myapp.min.js'
}
},
它似乎生成了一個myapp.min.js.map
文件,但它不再具有瀏覽器化之前存在的源映射中的原始源。
這是生成的源映射文件包含的內容:
{
"version":3,
"sources":[
"myapp.js"
],
"names":[
...
...
...
],
"mappings":".........",
"file":"myapp.min.js"
}
我已經嘗試對uglifyify
使用uglifyify
轉換,但這似乎沒有像 Uglify 任務那樣生成小文件。
我還將所有依賴項都更新到最新版本,但我無法解決此問題。
grunt-contrib-uglify
sourceMapIn
有一個sourceMapIn
選項,允許您指定來自早期編譯的輸入源映射文件的位置 - 在您的場景中是browserify
任務。
然而,雖然在您的browserify
任務中設置browserifyOptions: { debug: true }
確實會在結果.js
文件(即build/myapp.js
)中生成一個內聯源映射,但問題的症結是雙重的:
我們沒有可以配置后續grunt-contrib-uglify
任務的sourceMapIn
選項以使用的外部源映射文件。
grunt-browserify
不提供創建外部.map
文件的功能,它只創建內聯(見這里)
要解決上述問題,請考慮使用grunt-extract-sourcemap從build/myapp.js
(即從您的browserify
任務生成的輸出文件)中提取內聯源映射。
Gruntfile.js
以下要點顯示了您的Gruntfile.js應該如何配置:
module.exports = function (grunt) {
grunt.initConfig({
browserify: {
myapp: {
options: {
transform: ['babelify'],
browserifyOptions: {
debug: true
},
},
src: 'src/index.js',
dest: 'build/myapp.js'
}
},
extract_sourcemap: {
myapp: {
files: {
'build': ['build/myapp.js']
}
}
},
uglify: {
options: {
sourceMap: true,
sourceMapIn: 'build/myapp.js.map'
},
target: {
src: 'build/myapp.js',
dest: 'build/myapp.min.js'
}
}
});
grunt.loadNpmTasks('grunt-browserify');
grunt.loadNpmTasks('grunt-extract-sourcemap');
grunt.loadNpmTasks('grunt-contrib-uglify');
// Note the order of the tasks in your task list is important.
grunt.registerTask('default', ['browserify', 'extract_sourcemap', 'uglify']);
};
解釋
首先browserify
任務調用它輸出一個新的文件(即build/myapp.js
包含你捆綁的JavaScript和“內聯”源地圖信息)。 如果您在此階段檢查build/myapp.js
的內容,它會在最后包含類似以下內容:
//# sourceMappingURL=data:application/json;charset=utf-8;base64, ...
接下來調用extract_sourcemap
任務。 這實質上是從build/myapp.js
提取“內聯”源映射信息,並將其寫入名為myapp.js.map
的新文件,該文件保存在您的build
目錄中。
build/myapp.js
的原始“內聯”源映射信息被替換為指向新生成的源映射文件的鏈接,即myapp.js.map
。 如果您檢查build/myapp.js
的內容,您現在會注意到文件末尾的以下內容:
//# sourceMappingURL=myapp.js.map
最后調用uglify
任務。 注意它的sourceMapIn
選項如何配置為讀取build/myapp.js.map
,即我們在第 2 步生成的源映射文件。
此任務創建您想要的build/myapp.min.js
文件,其中包含; 您縮小的 JS,以及指向新生成的源映射文件build/myapp.min.js.map
。
注意最終生成的文件(即build/myapp.min.js
)現在正確映射回原始src/index.js
文件和index.js
本身可能具有import
'ed 或require()
'd 的任何文件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.