fis
fis copied to clipboard
fis压缩sea.js开发的代码后路径全部错了怎么办
用sea.js开发,里面的模块都用
//html里面的代码
seajs.use('./model/a', function(a) {
a.doSomething();
});
或者
模块里面的代码
define(function(require) {
var a = require('./a');
a.doSomething();
});
或者
define(‘./hello’, [‘jquery’], function(require, exports, module) {
// 模块代码
});
但是用fis将这些代码合并到pkg/lib.js后,所有的路径的引用就不对了,怎么解决呢??是不是fis不适合编译seajs等模块化项目啊?
有没有人回答下,求救
@ioriandy4
fis打包之后,会生成一个map.json文件,把这个文件的内容插入到页面上,然后针对seajs做一些扩展,监听seajs的文件路径查找事件,拦截,然后写一个小逻辑查这个map.json,返回pkg/lib.js这个url,让seajs加载。这样seajs也能支持fis的合并、md5等性能优化了
@fouber 这么复杂,让我前端狗无能为力了!!!
@ioriandy4
seajs没有直接接受资源表的接口,所以要用seajs需要这样扩展实现。不过我们自己用,其实模块化框架相当轻量,直接针对fis的map表写代码,代码很少,而且性能优化效果非常理想。模块化本身就非常非常少内容
@loriandy4 我也遇到过你的问题 发布的时候替换原来的module id就可以
fis.config.set('modules.prepackager', function(ret){
var map = ret.map.res;
fis.util.map(ret.src, function(path, file){
if (map[file.getId()]) {
file.setContent(file.getContent().replace(/define\((['"]).*?\1/, 'define("' + map[file.getId()].uri + '"'));
};
});
});
我已经在fis-config加入了上述代码,打印了路由过的路径是正确的,但是貌似没有起作用。我不知道seajs查找路径的时机是什么时候,怎么配置使得页面sea.use('moduleX')的时候,会按上面的代码去查找map中的实际地址啊
@jyjin 在seajs.config里面配置 moduleX: __uri(path) 在全局定义一个__uri的函数 直接返回传进去的path fis编译的时候会把__uri替换掉 我是这么做的
@jyjin 或者直接在use里面用__uri(path)也是ok的
压缩好像没有问题,打包的时候会有问题,目前我还没有打包。但是fis压缩的时候,sea有config配置的时候会有时间戳的问题,这个我倒是解决了,不过方法不太理想
@jyjin 你是不是define的时候id不是文件的路径
@ckrad 是的 统一配在config了
@jyjin 你这样打包之后是识别不了模块的 在config里你配置的是别名 别名不是模块的id 所以打包之后seajs识别不了需要的模块的 你应该把文件路径作为id 如果使用fis加md5戳 你还需要把define里面的id也替换成加了md5戳 这个不能用__uri实现 如果一个文件包含自己的路径 这个路径在这个文件是不能被fis替换的 可以自己在加完md5戳之后 自己添加一个处理id的过程
@ckrad 不打包的话是可以的,在fis confog提供的插件拓展接口中加上一段代码,去替换sea config中的文件名为时间戳文件名,可以成功,所以我索性就没打包了,呵呵
@jyjin sea config里面的路径你直接用__uri就可以替换
发了个 issues,貌似没什么搭理啊。 https://github.com/seajs/seajs/issues/1549
目前我这边也是,除了部分打包不支持外,其他都通了。