搜尋
首頁web前端html教學F.I.S初探(前端工程化)_html/css_WEB-ITnose

一、初识FIS

在做项目中遇到了静态资源浏览器缓存更新的问题,于是在网络上寻找解决方案。之前虽然没有解决过这个问题,但方法无非就是为其设定新URI使得浏览器强制更新。这个过程听起来还是相当简单的。

 

也是无意中搜索到了知乎上的一个帖子 大公司里怎样开发和部署前端代码?

看到这个文章中提到了FIS,跟随着文章开始学习走起,有点小兴奋,只不过很快便发现问题更多。

 

二、尝试

原本只是想着有个工具可以将前端资源打个标识,这样就可以轻松的解决浏览器静态缓存更新问题。FIS的描述也确实如此,那么就开始动手搞起吧。

安装

FIS是基于Nodejs开发,所以nodejs必须有。装起。。

然后通过npm命令装起, npm install -g fis。结果卡死了。

 

由于是第一次接触,所以在baidu上找了半天也没找到方案。放弃。。。

 

发现了官方视频教程,于是花时间看了几集,大概了解到FIS这个工具还是挺简单的。而且解决了前端开发的问题:

1、资源压缩

2、md5戳

3、资源合并

 

貌似比较有用的功能就这几个。而我最关心的就是md5戳咯。。

 

md5戳

所谓Md5戳就是这样的:

加戳后是这样的:

 

当然文件本身名称也变了:script/placeholder_88025f0.js

 

这样一来解决了两个问题:

1、引用静态资源的URI变了,那么自然浏览器会取新的资源,解决了更新缓存的问题

2、md5是通过文件计算得来,所以只有文件发生变化了才会产生新的URI,反之就不用变了,这就解决了增量更新的问题,同时兼顾了流量功击

 

当然对于我这种小项目来说第2点几乎没啥用。

 

再尝试安装

既然知道了好处,那就继续装吧,打开fis官方网站: http://fis.baidu.com,这里面有入门教程,这点毕竟百度团队公开的帮助还是相当可以的。而且是中文滴,好有亲近感。。找了原因可能是npm网站动不动会被墙导致的。。那么,官方也有方案,使用镜像:

npm install some-npm-module -g --registry=国内镜像 --disturl=https://npm.taobao.org/dist
这些东西官方网站都有提到,就不多说啦。出门左转去这里: https://github.com/fex-team/fis/issues/65

 

这次好了,安装好了,fis -v

 

三、遇到问题

装好了后那就开始在项目中用吧,这才发现自己太年轻。。。。。。

 

1、配置

直接使用fis release -md ../output,好了开始生成与发布。结果完蛋了,不管阿猫阿狗全部js/css/imgs都添加了md5戳。这可就麻烦了,完全不是自己想要的,也就是说直接通过一个工具一键解决加Md5戳的问题太理想了。

 

那么只好去研究官方的文档,了解具体的配置方式。在FIS中都是通过fis-conf.js这个文件来进行配置。官方例子:

// 设置图片合并的最小间隔

fis.config.set('settings.spriter.csssprites.margin', 20);

 

// 取消下面的注释开启simple插件,注意需要先进行插件安装 npm install -g fis-postpackager-simple

 fis.config.set('modules.postpackager', 'simple');

 

// 取消下面的注释设置打包规则

 fis.config.set('pack', {

     '/pkg/lib.js': [

         'js/lib/jquery.js',

         'js/lib/underscore.js',

         'js/lib/backbone.js',

         'js/lib/backbone.localStorage.js',

     ],

     // 取消下面的注释设置CSS打包规则,CSS打包的同时会进行图片合并

      '/pkg/aio.css': '**.css'

 });

 

// 取消下面的注释可以开启simple对零散资源的自动合并

 fis.config.set('settings.postpackager.simple.autoCombine', true);

 

fis.config.merge({

    roadmap : {

        path : [

            {

                //所有widget目录下的js文件

                reg : 'widget/**.js',

                //是模块化的js文件(标记为这种值的文件,会进行amd或者闭包包装)

                isMod : true,

                //默认依赖lib.js

                requires : [ 'lib.js' ],

                //向产出的map.json文件里附加一些信息

                extras : { say : '123' },

                //编译后产出到 /static/widget/xxx 目录下

                release : '/static$&'

            },

            {

                //所有的js文件

                reg : '**.js',

                //发布到/static/js/xxx目录下

                release : '/static/js$&'

            },

            {

                //所有的ico文件

                reg : '**.ico',

                //发布的时候即使加了--md5参数也不要生成带md5戳的文件

                useHash : false,

                //发布到/static/xxx目录下

                release : '/static$&'

            },

            {

                //所有image目录下的.png,.gif文件

                reg : /^\/images\/(.*\.(?:png|gif))/i,

                //访问这些图片的url是 '/m/xxxx?log_id=123'

                url : '/m/$1?log_id=123',

                //发布到/static/pic/xxx目录下

                release : '/static/pic/$1'

            },

            {

                //所有template目录下的.php文件

                reg : /^\/template\/(.*\.php)/i,

                //是类html文件,会进行html语言能力扩展

                isHtmlLike : true,

                //发布为gbk编码文件

                charset : 'gbk',

                //发布到/php/template/xxx目录下

                release : '/php/template/$1'

            },

            {

                //前面规则未匹配到的其他文件

                reg : /.*/,

                //编译的时候不要产出了

                release : false

            }

        ]

    }

});

这里面我目前用的最多的是roadmap,感觉这是个核心设置。

 

2、资源定位

所谓资源定位,就是在html/js/css中定位到资源引用,将FIS编绎(生成)过的新资源替换进去。那么其实挺简单的,就像本文最开始说的例子:

加戳后是这样的:


这样每次发布都是自动完成了资源更新,有点小爽。。只不过问题来了。。。FIS目前替换后的URI是绝对路径。这句话什么意思?

 

比如,一个css代码:

.h_login-conimgbg{background:transparent url('img/lgoin_image.png') no-repeat; height:406px;}

 

其中引用了img/lgoin_image.png这个图片。但是经过FIS编绎后是什么样:

.h_login-conimgbg{background:transparent url('/css/img/lgoin_image_369f159.png') no-repeat; height:406px;}

 

FIS直接将绝对路径进行的替换,这就带来了一个问题,原先是相对目录,换成绝对目录后就变成了根目录了。会有啥问题呢?

如果使用了二级目录就会出现问题,比如系统部署在tomcat的webapps下的myweb目录中,访问时:http://localhost:8080/myweb。那么上面css定位资源时是http://localhost:8080/myweb/css/img/lgon_image.png。

 

可是FIS编绎后就会这样:http://localhost:8080/css/img/lgon_image_369f159.png。这样就无法访问了。于是我在FIS的讨论区咨询了这个问题,给的回复是:

 

  现在全部是绝对路径,主要是考虑到资源合并和 cdn 部署的功能实现

 

这么一来就只能通过其他的方式解决,比如,roadmap里可以配置资源的url生成时添加domain,这个方法原本是用来做cdn部署时使用的。但是也可以解决上面的问题。

 

3、不想处理的文件

在系统里使用了许多第三方资源,如jquery、jqueryUi等库,但这些库我们基本不会去修改代码,也就不存在那些静态资源压缩、添加md5的问题了。那当然就不想在FIS里处理这些文件,而FIS是默认处理所有的js/css/imgs。这也就涉及到了配置的问题。

fis.config.merge({

    roadmap : {

  path : [

   {

                //plugin的js文件

                reg : /^\/plugin\/(.*\.(?:js|css))/i,

                useHash : false,

                useCompile : false,

                url : '${appServer}$&',

            }

        ]

    }

});

这是我截取的一个配置片段,通过reg来定位具体的目录

  • useHash:false,表示不添加md5戳
  • useCompile:false,表示不对资源进行编绎处理
  •  

    好了,有了这个配置,plugin下的js/css就不会被处理了。

     

    四、阶段感受

    其实到最后我已经放弃了,因为项目会用到jenkins hudson做集成,这里面还有许多的部署问题,时间关系就不愿意再深入了。原本想的用个工具加个md5戳或者版本号的想法破灭了。

     

    但是收获还是有的:

    1、前端的工程化原来可以有这么出格的思路,其实并没有什么特别大的进步,只不过是看起来很叼的样子。而且FIS感觉是起步阶段,对于开发相对较为规范的项目确实是可以考虑的一个辅助工具

    2、真正让我觉得有意思的地方是前端模块化。这部分是FIS里的进阶,真正的前端工程其实是这部分。我在前端方面的经验太少了,仅仅是初步水平,所以这部分高级内容需要花时间学习和实践

    3、无论产前端还是后端都是程序员,都是工程师。

     

    陳述
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    超越HTML:網絡開發的基本技術超越HTML:網絡開發的基本技術Apr 26, 2025 am 12:04 AM

    要構建一個功能強大且用戶體驗良好的網站,僅靠HTML是不夠的,還需要以下技術:JavaScript賦予網頁動態和交互性,通過操作DOM實現實時變化。 CSS負責網頁的樣式和佈局,提升美觀度和用戶體驗。現代框架和庫如React、Vue.js和Angular,提高開發效率和代碼組織結構。

    HTML中的布爾屬性是什麼?舉一些例子。HTML中的布爾屬性是什麼?舉一些例子。Apr 25, 2025 am 12:01 AM

    布爾屬性是HTML中的特殊屬性,不需要值即可激活。 1.布爾屬性通過存在與否控制元素行為,如disabled禁用輸入框。 2.它們的工作原理是瀏覽器解析時根據屬性的存在改變元素行為。 3.基本用法是直接添加屬性,高級用法可通過JavaScript動態控制。 4.常見錯誤是誤以為需要設置值,正確寫法應簡潔。 5.最佳實踐是保持代碼簡潔,合理使用布爾屬性以優化網頁性能和用戶體驗。

    如何驗證您的HTML代碼?如何驗證您的HTML代碼?Apr 24, 2025 am 12:04 AM

    HTML代碼可以通過在線驗證器、集成工具和自動化流程來確保其清潔度。 1)使用W3CMarkupValidationService在線驗證HTML代碼。 2)在VisualStudioCode中安裝並配置HTMLHint擴展進行實時驗證。 3)利用HTMLTidy在構建流程中自動驗證和清理HTML文件。

    HTML與CSS和JavaScript:比較Web技術HTML與CSS和JavaScript:比較Web技術Apr 23, 2025 am 12:05 AM

    HTML、CSS和JavaScript是構建現代網頁的核心技術:1.HTML定義網頁結構,2.CSS負責網頁外觀,3.JavaScript提供網頁動態和交互性,它們共同作用,打造出用戶體驗良好的網站。

    HTML作為標記語言:其功能和目的HTML作為標記語言:其功能和目的Apr 22, 2025 am 12:02 AM

    HTML的功能是定義網頁的結構和內容,其目的在於提供一種標準化的方式來展示信息。 1)HTML通過標籤和屬性組織網頁的各個部分,如標題和段落。 2)它支持內容與表現分離,提升維護效率。 3)HTML具有可擴展性,允許自定義標籤增強SEO。

    HTML,CSS和JavaScript的未來:網絡開發趨勢HTML,CSS和JavaScript的未來:網絡開發趨勢Apr 19, 2025 am 12:02 AM

    HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

    HTML:結構,CSS:樣式,JavaScript:行為HTML:結構,CSS:樣式,JavaScript:行為Apr 18, 2025 am 12:09 AM

    HTML、CSS和JavaScript在Web開發中的作用分別是:1.HTML定義網頁結構,2.CSS控製網頁樣式,3.JavaScript添加動態行為。它們共同構建了現代網站的框架、美觀和交互性。

    HTML的未來:網絡設計的發展和趨勢HTML的未來:網絡設計的發展和趨勢Apr 17, 2025 am 12:12 AM

    HTML的未來充滿了無限可能。 1)新功能和標準將包括更多的語義化標籤和WebComponents的普及。 2)網頁設計趨勢將繼續向響應式和無障礙設計發展。 3)性能優化將通過響應式圖片加載和延遲加載技術提升用戶體驗。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )專業的PHP整合開發工具

    SAP NetWeaver Server Adapter for Eclipse

    SAP NetWeaver Server Adapter for Eclipse

    將Eclipse與SAP NetWeaver應用伺服器整合。

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器