美文网首页编程杂货铺
F.I.S3的日常笔记,前端解决方案,打包静态资源

F.I.S3的日常笔记,前端解决方案,打包静态资源

作者: 会动的木头疙瘩儿 | 来源:发表于2017-03-25 01:38 被阅读301次

    我的github地址:https://github.com/liangxiaobo/fis3-notes

    关于F.I.S

    Fis3是百度团队推荐的Fis第三个版本,和webpack一样都需要 node.js环境的支持。Fis3的资源定位非常棒,它能在编译文件的时候,自动将html、css、中的url转换为对应的资源绝对路径.

    知乎上有一篇关于FIS与webpack的区别的文章 https://www.zhihu.com/question/50829160

    F.I.S官网:http://fis.baidu.com

    cnpm淘宝镜像地址:https://npm.taobao.org

    安装

    cnpm install -g fis3
    

    升级fis3

    cnpm update -g fis3 # 或者重装 cnpm install -g fis3
    

    举例

    下面介绍说说自己目前要解决一个开发后项目的前端问题,项目用java spring开发的,页面前面主要采用velocity模板开发;

    处理图片、css、js

    war包结构
    一般打包后的war包解压后是这样的:

    ├── META-INF
    ├── WEB-INF
    ├── res
    

    res下是资源文件,也就是需要用fis3来处理的表态资源,在开发过程中资源有很多冗余

    ├── css
    ├── css2.0
    ├── fontcss
    ├── images
    ├── images2.0
    ├── js
    ├── plugin
    ├── scripts
    ├── subject
    ├── subjectcss
    └── video
    

    我需要处理之后的目录应该像这样:

    ├── css
    ├── fontcss
    ├── images
    ├── plugin
    └── scripts
    

    把冗余去掉,整合到相应的目录中去。

    /**
     * fis-conf.js
     * 这里简单的的举例
     */
    
    // 只编译指定目录下的js
    fis.match('/res/{js,scripts}/**.js', {
      optimizer: fis.plugin('uglify-js'),
    });
    
    /*去除js里的console.log()*/
    fis.config.set('settings.optimizer.uglify-js', {
        compress : {
            drop_console: true
        }
    });
    
    fis.match('*.css', {
      // fis-optimizer-clean-css 插件进行压缩,已内置
      optimizer: fis.plugin('clean-css'),
    });
    
    fis.match('*.png', {
      // fis-optimizer-png-compressor 插件进行压缩,已内置
      optimizer: fis.plugin('png-compressor')
    });
    
    // 这个是将模板页面中的css压缩
    fis.match('*.vm:css', {
      optimizer: fis.plugin('clean-css')
    });
    
    /**
     *以上是对css,js,png的压缩处理
     *下面是对资源的整合
     */
    
    /**
     *
     * 把css放到res/css目录
     * $0 表示匹配到的整个规则
     * $1 表示匹配到的**.css
     */
    fis.match('/res/{css,css2.0,subjectcss,subject,video}/**.css', {
      useHash: true,
      release: 'res/css/$1'
    });
    
    /**
     *
     * 把js放到res/scripts目录
     */
    fis.media(media_key_build).match('/res/{js,scripts,subject,video}/**.js', {
      useHash: true,
      release: 'res/scripts/$1'
    });
    
    /**
     *
     * 把jpg,png,gif放到res/images目录
     */
    fis..match('**.{gif,jpg,png,ico}', {
      useHash: true,
      release: 'res/images/$1'
    });
    
    /**
     * 如果需要把某些文件按原文件路径和原文件名的话,可以这样做
     * 将 "/res/images2.0/account/info" 目录下的 *.{png,jpg,gif}按原目录存放
     * fis.match('/res/images2.0/account/info/*.{png,jpg,gif}', {
     * useHash: false,
     * release: '$0'
     * });
     */
    

    这样配置完后运行

    # 我将产出的文件发布到上一层的output目录
    fis3 release -d ../output
    

    处理后的res目录

    ├── css
    ├── fontcss
    ├── images
    ├── plugin
    └── scripts
    

    WEB-INF下面的文件处理

    下面说一说前端页面问题,Fis的资源定位,在处理相应的资源时,会替换掉页面中相应的url,src,href的路径为绝对路径,模板页面不是纯html其中有些url拼接上会有$request.getContextPath()的模板脚本,如果<script type="text/javascript" src="$request.getContextPath()/res/scripts/a.js"></script> 资源定位是定位不到的,解析不了这个url,我的解决方案是先将$request.getContextPath()替换成''(空) /res/scripts/a.js这样就可以找到 可以利用F.I.S中的 插件fis3-deploy-replace这个插件需要安装的

    npm install [-g] fis3-deploy-replace
    # 加上 "-g" 表示全局安装,不加表示安装本项目
    

    fis3-deploy-replace 使用

    /**
     * media是FIS用来处理不同环境时的配置比如“开发、测试、生产”
     * 我这样配置就可以单独执行替换处理 `fis3 release release_vm -d ./`
     * ./是将当前目录的文件替换
     */
    var media_key_release_vm = "release_vm";
    fis.media(media_key_release_vm).match('*.vm', {
      deploy: [
        // 把src的路径上带$request.getContextPath()的替换成''(空)
        fis.plugin('replace', {
          from: 'src\=\"\$request\.getContextPath\(\)',
          to:  'src\=\"' 
        }),
        // 也可以用正则表达式来处理
        fis.plugin('replace', {
            from: /href="(\$request\.getContextPath\(\))(.*)\.css/g,
            to: function($0, $1){
              return $0.replace('\$request\.getContextPath\(\)', '');
            }
        }),
        fis.plugin('local-deliver')
      ]
    });
    

    关于media可以查看F.I.S的官网说明 http://fis.baidu.com/fis3/docs/api/config-api.html#fismedia
    当处理完之后,再执行上面处理资源的fis-conf.js就能把模板中的资源路径处理掉绝对路径了

    这两个操作可以写成一样fis-conf.js配置文件,用media方式来配置就可以了,正确的方式如下:

    var media_key_release_vm = "release_vm", 
        media_key_build = "build";
    
    /*去除js里的console.log()*/
    fis.config.set('settings.optimizer.uglify-js', {
        compress : {
            drop_console: true
        }
    });
    
    /** 
     * project.files 
     * 实际是过滤哪些文件需要产出的设置,规则前面加!是取反,
     * 故也可以用来过滤掉不需要的文件,
     * 这个可以把发布出来的项目瘦身
     */
    fis.set('project.files', 
    ['!**.svntmp',
    '!**.bak', // 过滤掉.bak的备份文本
    '!bak.**']);// 过滤掉bak.*的备份文本
    
    // 只编译指定目录下的js
    fis.media(media_key_build).match('/res/{js,scripts}/**.js', {
      optimizer: fis.plugin('uglify-js'),
    }).
    
    match('*.css', {
      // fis-optimizer-clean-css 插件进行压缩,已内置
      optimizer: fis.plugin('clean-css'),
    }).
    
    match('*.png', {
      // fis-optimizer-png-compressor 插件进行压缩,已内置
      optimizer: fis.plugin('png-compressor')
    }).
    
    // 这个是将模板页面中的css压缩
    match('*.vm:css', {
      optimizer: fis.plugin('clean-css')
    }).
    
    /**
     *以上是对css,js,png的压缩处理
     *下面是对资源的整合
     */
    
    /**
     *
     * 把css放到res/css目录
     * $0 表示匹配到的整个规则
     * $1 表示匹配到的**.css
     */
    match('/res/{css,css2.0,subjectcss,subject,video}/**.css', {
      useHash: true,
      release: 'res/css/$1'
    }).
    
    /**
     *
     * 把js放到res/scripts目录
     */
    fis.media(media_key_build).match('/res/{js,scripts,subject,video}/**.js', {
      useHash: true,
      release: 'res/scripts/$1'
    }).
    
    /**
     *
     * 把jpg,png,gif放到res/images目录
     */
    match('**.{gif,jpg,png,ico}', {
      useHash: true,
      release: 'res/images/$1'
    });
    
    /**
     * 如果需要把某些文件按原文件路径和原文件名的话,可以这样做
     * 将 "/res/images2.0/account/info" 目录下的 *.{png,jpg,gif}按原目录存放
     * fis.match('/res/images2.0/account/info/*.{png,jpg,gif}', {
     * useHash: false,
     * release: '$0'
     * });
     */
    
    
    // 下面是替换部分的配置 fis3 release release_vm -d ./
    
    fis.media(media_key_release_vm).match('*.vm', {
      deploy: [
        // 把src的路径上带$request.getContextPath()的替换成''(空)
        fis.plugin('replace', {
          from: 'src\=\"\$request\.getContextPath\(\)',
          to:  'src\=\"' 
        }),
        // 也可以用正则表达式来处理
        fis.plugin('replace', {
            from: /href="(\$request\.getContextPath\(\))(.*)\.css/g,
            to: function($0, $1){
              return $0.replace('\$request\.getContextPath\(\)', '');
            }
        }),
        fis.plugin('local-deliver')
      ]
    });
    

    关于 fis.set() 看F.I.S官网 http://fis.baidu.com/fis3/docs/api/config-api.html
    最后的 fis-conf.js 需要执行两次才能完成处理:

    # 先执行
    fis3 release release_vm -d ./
    # 再执行
    fis3 release build -d ../output
    

    还可以直接把处理后的文件重新打包成war包自动化发布,后续等待...

    相关文章

      网友评论

        本文标题:F.I.S3的日常笔记,前端解决方案,打包静态资源

        本文链接:https://www.haomeiwen.com/subject/fsbqottx.html