gpt4 book ai didi

gruntjs - 启用了 sourceMap 选项的 Uglify 与它应该引用的 filerev js 文件不匹配

转载 作者:行者123 更新时间:2023-12-01 03:44:29 25 4
gpt4 key购买 nike

你好,

我只是启用sourceMap grunt-contrib-uglify 模块的选项为我的 concat-jshint-minified-filerev javascript 文件生成映射文件。

dist我可以看到的目录:

  • 分布/
  • vendor.6ff9fbf4.js
  • vendor.6ff9fbf4.js.map

  • 但如果我编辑 vendor.6ff9fbf4.js ,我可以在文件末尾看到引用的 sourceMap 是错误的

    /* much, much, much minified code here */
    //# sourceMappingURL=vendor.js.map

    如果我打开 vendor.6ff9fbf4.js.map我可以在第一行看到引用源文件也是错误的。

    {"version":3,
    "file":"vendor.js",
    "sources":["../../.tmp/concat/scripts/vendor.js"]
    /* much, much, much more things here */
    }

    显然, grunt-filerev 之后的文件没有被重命名。任务。

    关于如何做到这一点的任何建议?

    配置: Gruntfile.js

    // Generated on 2014-06-19 using generator-angular 0.9.0-1
    'use strict';

    // # Globbing
    // for performance reasons we're only matching one level down:
    // 'test/spec/{,*/}*.js'
    // use this if you want to recursively match all subfolders:
    // 'test/spec/**/*.js'

    module.exports = function (grunt) {

    grunt.loadNpmTasks('grunt-ng-annotate');

    // Load grunt tasks automatically
    require('load-grunt-tasks')(grunt);

    // Time how long tasks take. Can help when optimizing build times
    require('time-grunt')(grunt);

    // Configurable paths for the application
    var appConfig = {
    app: require('./bower.json').appPath || 'app',
    dist: 'dist'
    };

    // Define the configuration for all the tasks
    grunt.initConfig({

    // Project settings
    yeoman: appConfig,

    // Watches files for changes and runs tasks based on the changed files
    watch: {
    bower: {
    files: ['bower.json'],
    tasks: ['wiredep']
    },
    js: {
    files: ['<%= yeoman.app %>/scripts/{,*/**/}*.js'],
    tasks: ['newer:jshint:all'],
    options: {
    livereload: '<%= connect.options.livereload %>'
    }
    },
    jsTest: {
    files: ['test/spec/{,*/**/}*.js'],
    tasks: ['newer:jshint:test', 'karma']
    },
    styles: {
    files: ['<%= yeoman.app %>/styles/{,*/**/}*.css'],
    tasks: ['newer:copy:styles', 'autoprefixer']
    },
    gruntfile: {
    files: ['Gruntfile.js']
    },
    livereload: {
    options: {
    livereload: '<%= connect.options.livereload %>'
    },
    files: [
    '<%= yeoman.app %>/{,*/**/}*.html',
    '.tmp/styles/{,*/**/}*.css',
    '<%= yeoman.app %>/images/{,*/**/}*.{png,jpg,jpeg,gif,webp,svg}'
    ]
    }
    },

    // The actual grunt server settings
    connect: {
    options: {
    port: 9000,
    // Change this to '0.0.0.0' to access the server from outside.
    hostname: '0.0.0.0',
    livereload: 35729
    },
    livereload: {
    options: {
    open: true,
    middleware: function (connect) {
    return [
    connect.static('.tmp'),
    connect().use(
    '/bower_components',
    connect.static('./bower_components')
    ),
    connect.static(appConfig.app)
    ];
    }
    }
    },
    test: {
    options: {
    port: 9001,
    middleware: function (connect) {
    return [
    connect.static('.tmp'),
    connect.static('test'),
    connect().use(
    '/bower_components',
    connect.static('./bower_components')
    ),
    connect.static(appConfig.app)
    ];
    }
    }
    },
    dist: {
    options: {
    open: true,
    base: '<%= yeoman.dist %>'
    }
    }
    },

    // Make sure code styles are up to par and there are no obvious mistakes
    jshint: {
    options: {
    jshintrc: '.jshintrc',
    reporter: require('jshint-stylish')
    },
    all: {
    src: [
    'Gruntfile.js',
    '<%= yeoman.app %>/scripts/{,*/**/}*.js'
    ]
    },
    test: {
    options: {
    jshintrc: 'test/.jshintrc'
    },
    src: ['test/spec/{,*/**/}*.js']
    }
    },

    // Empties folders to start fresh
    clean: {
    dist: {
    files: [{
    dot: true,
    src: [
    '.tmp',
    '<%= yeoman.dist %>/{,*/**/}*',
    '!<%= yeoman.dist %>/.git*'
    ]
    }]
    },
    server: '.tmp'
    },

    // Add vendor prefixed styles
    autoprefixer: {
    options: {
    browsers: ['last 1 version']
    },
    dist: {
    files: [{
    expand: true,
    cwd: '.tmp/styles/',
    src: '{,*/**/}*.css',
    dest: '.tmp/styles/'
    }]
    }
    },

    // Automatically inject Bower components into the app
    wiredep: {
    app: {
    src: ['<%= yeoman.app %>/index.html'],
    ignorePath: new RegExp('^<%= yeoman.app %>/|../')
    }
    },

    // Renames files for browser caching purposes
    filerev: {
    dist: {
    src: [
    '<%= yeoman.dist %>/scripts/{,*/**/}*.js',
    '<%= yeoman.dist %>/styles/{,*/**/}*.css',
    '<%= yeoman.dist %>/images/{,*/**/}*.{png,jpg,jpeg,gif,webp,svg}',
    '<%= yeoman.dist %>/styles/fonts/*'
    ]
    }
    },

    // Reads HTML for usemin blocks to enable smart builds that automatically
    // concat, minify and revision files. Creates configurations in memory so
    // additional tasks can operate on them
    useminPrepare: {
    html: '<%= yeoman.app %>/index.html',
    options: {
    dest: '<%= yeoman.dist %>',
    flow: {
    html: {
    steps: {
    js: ['concat', 'uglifyjs'],
    css: ['cssmin']
    },
    post: {}
    }
    }
    }
    },

    // Performs rewrites based on filerev and the useminPrepare configuration
    //html: ['<%= yeoman.dist %>/{,*/**/}*.html'],
    usemin: {
    html: ['<%= yeoman.dist %>/**/*.html'],
    css: ['<%= yeoman.dist %>/styles/{,*/**/}*.css'],
    options: {
    assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist %>/images']
    }
    },

    // The following *-min tasks will produce minified files in the dist folder
    // By default, your `index.html`'s <!-- Usemin block --> will take care of
    // minification. These next options are pre-configured if you do not wish
    // to use the Usemin blocks.
    // cssmin: {
    // dist: {
    // files: {
    // '<%= yeoman.dist %>/styles/main.css': [
    // '.tmp/styles/{,*/}*.css'
    // ]
    // }
    // }
    // },
    // uglify: {
    // dist: {
    // files: {
    // '<%= yeoman.dist %>/scripts/scripts.js': [
    // '<%= yeoman.dist %>/scripts/scripts.js'
    // ]
    // }
    // }
    // },
    // concat: {
    // dist: {}
    // },

    imagemin: {
    dist: {
    files: [{
    expand: true,
    cwd: '<%= yeoman.app %>/images',
    src: '{,*/}*.{png,jpg,jpeg,gif}',
    dest: '<%= yeoman.dist %>/images'
    }]
    }
    },

    svgmin: {
    dist: {
    files: [{
    expand: true,
    cwd: '<%= yeoman.app %>/images',
    src: '{,*/}*.svg',
    dest: '<%= yeoman.dist %>/images'
    }]
    }
    },

    htmlmin: {
    dist: {
    options: {
    collapseWhitespace: true,
    conservativeCollapse: true,
    collapseBooleanAttributes: true,
    removeCommentsFromCDATA: true,
    removeOptionalTags: true
    },
    // src: ['*.html', 'views/{,*/**/}*.html'],
    files: [{
    expand: true,
    cwd: '<%= yeoman.dist %>',
    src: ['*.html', 'views/**/*.html'],
    dest: '<%= yeoman.dist %>'
    }]
    }
    },

    // ngAnnotate tries to make the code safe for minification automatically by
    // using the Angular long form for dependency injection. It doesn't work on
    // things like resolve or inject so those have to be done manually.
    ngAnnotate: {
    dist: {
    files: [{
    expand: true,
    cwd: '.tmp/concat/scripts',
    src: '*.js',
    dest: '.tmp/concat/scripts'
    }]
    }
    },

    // Replace Google CDN references
    cdnify: {
    dist: {
    html: ['<%= yeoman.dist %>/*.html']
    }
    },

    // Copies remaining files to places other tasks can use
    copy: {
    dist: {
    files: [{
    expand: true,
    dot: true,
    cwd: '<%= yeoman.app %>',
    dest: '<%= yeoman.dist %>',
    //'views/{,*/}*.html',
    src: [
    '*.{ico,png,txt}',
    '.htaccess',
    '*.html',
    'views/**/*.html',
    'images/{,*/}*.{webp}',
    'fonts/*'
    ]
    }, {
    expand: true,
    cwd: '.tmp/images',
    dest: '<%= yeoman.dist %>/images',
    src: ['generated/*']
    }]
    },
    styles: {
    expand: true,
    cwd: '<%= yeoman.app %>/styles',
    dest: '.tmp/styles/',
    src: '{,*/}*.css'
    }
    },

    // Run some tasks in parallel to speed up the build process
    concurrent: {
    server: [
    'copy:styles'
    ],
    test: [
    'copy:styles'
    ],
    dist: [
    'copy:styles',
    'imagemin',
    'svgmin'
    ]
    },

    // Test settings
    karma: {
    unit: {
    configFile: 'test/karma.conf.js',
    singleRun: true
    }
    } ,

    uglify: {
    options : {
    sourceMap : true,
    compress : true,
    mangle : true
    }
    }
    });


    grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
    if (target === 'dist') {
    return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
    'clean:server',
    'wiredep',
    'concurrent:server',
    'autoprefixer',
    'connect:livereload',
    'watch'
    ]);
    });

    grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
    grunt.task.run(['serve:' + target]);
    });

    grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'autoprefixer',
    'connect:test',
    'karma'
    ]);

    grunt.registerTask('build', [
    'clean:dist',
    'wiredep',
    'useminPrepare',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'ngAnnotate',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'filerev',
    'usemin',
    'htmlmin'
    ]);

    grunt.registerTask('default', [
    'newer:jshint',
    'test',
    'build'
    ]);
    };

    最佳答案

    最近遇到了这个问题(实际上是一组问题)。这是我解决它的方法。

    首先必须更新 grunt 插件依赖项:

    "grunt-filerev": "^2.3.*"
    "grunt-contrib-uglify": "^0.9.*",

    第一个是因为最新的 filerev 还将源映射名称更改为已修改的名称(匹配 .js),第二个是因为我使用的版本甚至没有 sourceMap bool 选项。

    但这还不够。您必须在 dist 文件夹上进行“丑化”。使用您的设置
    useminPrepare: {
    html: '<%= yeoman.app %>/index.html',
    options: {
    dest: '<%= yeoman.dist %>',
    flow: {
    html: {
    steps: {
    js: ['concat', 'uglifyjs'],
    css: ['cssmin']
    },
    post: {}
    }
    }
    }
    },

    您正在 concat 文件夹中制作它,并且 uglify 任务正在解析到 的相对路径“来源”:[“../../.tmp/concat/scripts/vendor.js”] .

    所以从 js 步骤数组中删除“uglifyjs”。
            steps: {
    js: ['concat'],
    css: ['cssmin']
    },

    我们现在需要指出丑化的位置,这样:
    uglify: {
    options : {
    sourceMap : true,
    compress : true,
    mangle : true
    },
    all: {
    files: [{
    expand: true,
    cwd: '<%= yeoman.dist %>/scripts',
    src: [
    '*.js',
    '!*<%= yeoman.beforeUglifyMarker %>.js'
    ],
    dest: '<%= yeoman.dist %>/scripts',
    ext: '.js'
    }]
    }

    }

    您会注意到 <%= yeoman.beforeUglifyMarker %>。您应该在 appConfig 对象中创建 beforeUglifyMarker 属性,我们将使用该属性从 uglification 中排除非 uglified 原始文件,使它们在与源映射相同的路径中可用。

    所以在 uglify 任务运行之前,我们将复制将要被 uglify 的文件,用 yeoman.beforeUglifyMarker 的值重命名它们(这样我们就可以保持原始文件与源映射匹配)。

    在您的复制任务中创建 2 个目标:
            savePrettyVersion: {
    expand: true,
    cwd: '<%= yeoman.dist %>/scripts',
    dest: '<%= yeoman.dist %>/scripts',
    src: '*.js',
    rename: function(dest, src){
    var name = src.split('.')[0];
    return dest + '/' + name + appConfig.beforeUglifyMarker + '.js';
    }
    },
    restorePrettyVersion: {
    expand: true,
    cwd: '<%= yeoman.dist %>/scripts',
    dest: '<%= yeoman.dist %>/scripts',
    src: '*<%= yeoman.beforeUglifyMarker %>.js',
    rename: function(dest, src){
    var originalParts = src.split(appConfig.beforeUglifyMarker);
    return dest + '/' + originalParts.join('');
    }
    },

    在您的构建任务中使用它们,如下所示:
            'copy:savePrettyVersion',
    'uglify',
    'filerev',
    'usemin',
    'htmlmin',
    'copy:restorePrettyVersion',
    'clean:nonUglyTempFiles',

    最后一个是可选的,只是清理临时文件。

    然后确保从 filerev uglify 和使用否定模式或正则表达式的 usemin 任务中排除临时文件(用 beforeUglifyMarker 标记)。
    usemin: {
    html: ['<%= yeoman.dist %>/**/*.html'],
    css: ['<%= yeoman.dist %>/styles/{,*/**/}*.css'],
    js: [
    '<%= yeoman.dist %>/scripts/{,*/}*.js',
    '!<%= yeoman.dist %>/scripts/*<%= yeoman.beforeUglifyMarker %>.js',
    ],

    options: {
    assetsDirs: ['<%= yeoman.dist %>','<%= yeoman.dist %>/images']
    }
    },
    filerev: {
    dist: {
    src: [
    '<%= yeoman.dist %>/scripts/{,*/**/}*.js',
    '!<%= yeoman.dist %>/scripts/*<%= yeoman.beforeUglifyMarker %>.js',

    '<%= yeoman.dist %>/styles/{,*/**/}*.css',
    '<%= yeoman.dist %>/images/{,*/**/}*.{png,jpg,jpeg,gif,webp,svg}',
    '<%= yeoman.dist %>/styles/fonts/*'
    ]
    }
    },

    这是一个 hacky 解决方法,它可以工作,但以后应该避免使用, look/watch this issue on usemin .同时我希望它有帮助。

    关于gruntjs - 启用了 sourceMap 选项的 Uglify 与它应该引用的 filerev js 文件不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280564/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com