• gulp配合fs插件与path插件实现遍历目录得到子目录


    由于每个项目的架构不同,使用gulp压缩文件、实现MD5戳时可能出现路径问题。

    项目结构如下

    weapp

      lib

      lar-ui

      page

        folder1

          index.html

          index.css

          index.js

      

        folder2

          index.html

          index.css

          index.js

            gulpfile.js  

    项目面临的问题

    项目上线时要求对JS、CSS文件进行压缩并生成时间戳处理浏览器缓存问题,原先直接从gulpfile.js所在的根目录下手,代码如下:

    /**
     * 压缩js,生成时间戳
     */
    gulp.task('uglifyJs',function(){
        return gulp.src(['./**/*.js','!./node_modules/**/*.js','!./gulpfile.js','!./page/maanshan/*.js','!./page/masSelfBuildLiterature/*.js'],{read:true})
        //压缩js
            .pipe(plugins.uglify())
            //生成MD5
            .pipe(plugins.rev())
            //输出压缩生成时间戳后的js文件
            .pipe(gulp.dest('./'))
            //生成rev.json文件
            .pipe(plugins.rev.manifest({merge:true}))
            //输出json文件
            .pipe(gulp.dest('rev/js'));
    }); 

    这样压缩后会把所有带MD5戳的js文件路径输出到一个rev里的json文件中,而我这个项目html中引入css,js都是同目录引入,这就导致在替换路径时同名css,js出现覆盖现象,也就是项目中的index.html替换路径时引入的都是folder2文件下的带有时间戳的css、js文件,打开页面会出现文件404报错!

    解决办法

    所以我们要把page目录遍历得到每一个子目录,让它每个目录生成各自对应的rev的Json文件,避免了文件覆盖。

    利用fs插件、path插件写一个遍历函数,把page目录下的子目录都存进一个数组里,然后通过map得到每一个目录,代码如下:

    //定义处理的目录
    var pageDir = './page/';
    var revDest = 'rev/';
    
    
    /**
     * 原因:由于page文件夹js、css在html引入中输入直接引入,所以在下面的MD5戳rev路径替换中出错
     * 解决方法:利用fs插件和path插件写一个函数,
     * 遍历文件夹,把所有文件的路径拼到一个数组里,然后通过map获取到每一个文件
     * 效果:这里获取到page下面的每一个文件夹做单独处理,每个文件夹生成单独的rev的json文件
     * 避免了路径替换覆盖问题
     */
    function getFolders(dir) {
        return fs.readdirSync(dir)
            .filter(function(file) {
                return fs.statSync(path.join(dir, file)).isDirectory();
            });
    }
    
    //调用getFolders方法处理page文件夹,遍历得到每一个子文件夹,单独做js压缩、混淆、加MD5戳处理
    gulp.task('uglifyJsPage',function(){
        //调用getFolders方法获取到文件集合
        var folders = getFolders(pageDir);
        //遍历得到每一个子文件
        var tasks = folders.map(function(folder){
            //rev文件输出地址
            var setDir = revDest+folder+'/js';
            gulp.src([pageDir+folder+'/**/*.js','!page/*.js'])
                //压缩js
                .pipe(plugins.uglify())
                //生成MD5
                .pipe(plugins.rev())
                //输出压缩生成时间戳后的js文件
                .pipe(gulp.dest(pageDir+folder))
                //生成rev.json文件
                .pipe(plugins.rev.manifest({merge:true}))
                //输出json文件
                .pipe(gulp.dest(setDir));
        });
        return tasks;
    
    });
    
    //替换路径
    gulp.task('pagePath',function(){
        var folders = getFolders(pageDir);
        var tasks = folders.map(function(folder){
            gulp.src([revDest+folder+'/**/*.json',pageDir+folder+'/**/*.html'])
                .pipe(plugins.revCollector())
                //输出路径
                .pipe(gulp.dest(pageDir+folder));
        });
        return tasks;
    });

    问题解决。  

  • 相关阅读:
    企业网络设计 华为S系列园区交换机组网
    zabbix安装注意以下几个部分
    grafana custom dashboard
    prometheus 生产环境部署
    Cephadm部署ceph octopus (15.2.13 )
    ipmi之外的新的选择redfish
    mongo & mongoexpress & redis & redisinsight 容器化安装
    ceph cluster 部署 (cephadm)
    kubernetes 1.21 helm3
    kubernetes 1.21部署 kubeprometheus
  • 原文地址:https://www.cnblogs.com/hess/p/7239879.html
Copyright © 2020-2023  润新知