FIS 以下统称为 FIS2
FIS3相对FIS2来说接口改动较大,并不是不考虑版本上的兼容,而是不愿意做简单的小修小补,希望从整体的角度打造一个易用性和可扩展性
达到一个全新高度的工具。FIS2 与FIS3将并行维护,并且绝大部分插件是兼容的。
FIS2中roadmap是最先匹配生效的,如果想覆盖解决方案的默认配置比较麻烦。FIS3中使用了类似css的配置语法,使用叠加的机制,同一个配置最后一个生效:
fis.match('{a,b}.js', {
release: '/static/$0'
});
fis.match('b.js', {
release: '/static/new/$0'
});
并且通过类似css media的API来控制不同用户、环境的配置:
fis.media('prod')
.match('**.js', {
optimizer: fis.plugin('uglify-js')
})
.match('component_modules/*.js',{
packTo: '/static/pkg/common.js'
})
另外你还可以像css !important一样设置不可以被覆盖的配置:
//important设为true表示不可被覆盖
fis.match(selector, props[, important])
fis.match('*.js', {
useHash: true,
release: '/static/$0'
},true);
FIS2中插件都需要安装到全局才能使用,不方便自定义插件的开发和部署。FIS3中包括FIS3和插件都可以安装在项目本地使用。插件将优先使用本地的。
从模块化开发和工程化部署的角度,我们并不推荐使用相对路径产出部署的方式,在FIS2中这个也是基本不支持的(可以关闭标准处理,但变成了一个压缩工具)。
考虑到一些用户的需求,FIS3中可以安装一个插件来实现相对目录的产出:
//全局或本地安装插件
npm install [-g] fis3-hook-relative
//fis-conf.js
// 启用插件
fis.hook('relative');
// 让所有文件,都使用相对路径。
fis.match('**', {
relative: true
})
具体见插件说明 https://github.com/fex-team/fis3-hook-relative
FIS2中可以通过include
或者exclude
来过滤源码,然而只有规则匹配的目录才生效。
FIS3中可以通过设置files过滤需要编译的源码,同时支持分析files中引用或依赖到的被过滤的资源目录中的文件。
fis.set('project.files', ['page/**','map.json','modules/**','lib']);
典型的使用场景如angular中,bower下面的资源有大量的冗余,并且可能导致编译失败。通过手工配置过滤比较麻烦,而通过files引用来分析资源就能屏蔽bower下载目录的情况下,自动找出其中被使用的资源。 示例见fis3-demo
-
为什么这么做?
虽然现在很多模块化框架都以
require
来作为依赖,但是其形式是不同的。比如require.js
require(['./a.js'])
mod.js
require.async('./a.js');
sea.js
sea.use('./a.js');
-
如果要解析
require()
需要自己添加preprocessor
插件支持,而这个插件的逻辑相当简单。参考
https://github.com/fex-team/fis3-hook-commonjs/blob/master/index.js
-
如果感觉自己写插件太麻烦
可以安装 FIS组 提供的模块化方案的支持插件 fis3-hook-commonjs
fis.hook('commonjs'); // 如果 jswrapper 自定义要做 fis.hook('commonjs', {wrap: false});
FIS2纯前端方案中使用fis-postpackager-simple 来实现资源自动合并,fis3中我们提供了一个新的扩展插件来实现类似功能,不仅支持灵活自动的打包配置,而且能产出适配requireJS、modJS的资源依赖配置。
具体文件见插件:https://github.com/fex-team/fis3-postpackager-loader
FIS2中组件化资源默认开启了同名依赖设置,对初学者可能造成困惑。FIS3中默认关闭了同名依赖,您需要主动声明资源间的依赖关系。不过你也可以通过配置来开启同名依赖功能:
fis.match('*.{html,js}', {
useSameNameRequire: true
});
FIS2 中开启watch
并修改fis-conf.js时,工具不会自动重启,FIS3中能自动监听fis-conf.js的变化并给出提示,自动重启。
FIS2 中通过<script>
或<style>
内嵌的语言不能是less、sass等异构语言,fis3中支持直接内嵌异构语言:
<script type="text/x-coffee">
//...
</script>
<style type="text/x-less">
body {
background-color: #F0F0F0;
h1 {
color: red;
}
}
</style>
FIS3中对于常见的错误将给出提示,并提供对应的github issue 链接,您可以在相应地方寻找解决办法。如果依旧没有解决欢迎提issue。
FIS3 配置上很灵活,通过给文件分配属性,由这些属性控制编译流程。不像 FIS2 给 release
添加参数就能搞定很多事情了,比如所有静态资源压缩、加 md5、打包、加 domain 等,这些功能在 FIS3 中必须通过配置文件配置进行操控。
fis.match('*.js', {
optimizer: fis.plugin('uglify-js')
});
fis.match('*.css', {
optimizer: fis.plugin('clean-css')
});
fis.match('*.png', {
optimizer: fis.plugin('png-compressor')
});
fis.match('*.js', {
domain: 'http://cdn.baidu.com'
})
fis.match('*.{js,css}', {
useHash: true
});
//命中所有的图片类文件,包括字体等
fis.match('image', {
useHash: true
});
fis.match('::package', {
packager: fis.plugin('some-pack-plugin'), // 挂载一个打包插件
spriter: fis.plugin('csssprites') // FIS2 默认启用 csssprites
});
fis.match('/widget/*.js', {
packTo: '/static/widget_aio.js' // 匹配文件打包到此文件中
});
FIS3中默认不产出map.json配置文件,但提供了一个标记符__RESOURCE_MAP__
支持您将map.json产出到任意位置,例如您的项目根目录下有个文件manifest.json里面包含此字符,那么产出后mapjson 静态资源表就会在其中。
FIS2中通过数组来添加打包配置。FIS3中则是通过属性来控制打包:
//fis-conf.js
fis.match('/widget/*.js', {
packTo: '/static/widget_pkg.js'
})
您也可以在match中填写数组来控制打包顺序。另外简单的纯前端打包需求可以通过自动打包插件来实现。
FIS2中入门DEMO比较少,FIS3中我们提供了丰富的DEMO,从简单的合并压缩到纯前端的angular、react、vuejs等,到最终结合后端smarty、php和laravel框架的解决方案都有相应的demo。具体见 https://github.com/fex-team/fis3-demo