fis icon indicating copy to clipboard operation
fis copied to clipboard

fis压缩sea.js开发的代码后路径全部错了怎么办

Open ioriandy4 opened this issue 10 years ago • 16 comments

用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 avatar May 15 '15 02:05 ioriandy4

有没有人回答下,求救

ioriandy4 avatar May 15 '15 03:05 ioriandy4

@ioriandy4

fis打包之后,会生成一个map.json文件,把这个文件的内容插入到页面上,然后针对seajs做一些扩展,监听seajs的文件路径查找事件,拦截,然后写一个小逻辑查这个map.json,返回pkg/lib.js这个url,让seajs加载。这样seajs也能支持fis的合并、md5等性能优化了

fouber avatar May 15 '15 03:05 fouber

@fouber 这么复杂,让我前端狗无能为力了!!!

ioriandy4 avatar May 15 '15 03:05 ioriandy4

@ioriandy4

seajs没有直接接受资源表的接口,所以要用seajs需要这样扩展实现。不过我们自己用,其实模块化框架相当轻量,直接针对fis的map表写代码,代码很少,而且性能优化效果非常理想。模块化本身就非常非常少内容

fouber avatar May 15 '15 03:05 fouber

@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 + '"'));
        };
    });
});

ckrad avatar Jun 09 '15 04:06 ckrad

我已经在fis-config加入了上述代码,打印了路由过的路径是正确的,但是貌似没有起作用。我不知道seajs查找路径的时机是什么时候,怎么配置使得页面sea.use('moduleX')的时候,会按上面的代码去查找map中的实际地址啊

jyjin avatar Jun 24 '15 07:06 jyjin

@jyjin 在seajs.config里面配置 moduleX: __uri(path) 在全局定义一个__uri的函数 直接返回传进去的path fis编译的时候会把__uri替换掉 我是这么做的

ckrad avatar Jul 02 '15 05:07 ckrad

@jyjin 或者直接在use里面用__uri(path)也是ok的

ckrad avatar Jul 02 '15 05:07 ckrad

压缩好像没有问题,打包的时候会有问题,目前我还没有打包。但是fis压缩的时候,sea有config配置的时候会有时间戳的问题,这个我倒是解决了,不过方法不太理想

jyjin avatar Jul 02 '15 06:07 jyjin

@jyjin 你是不是define的时候id不是文件的路径

ckrad avatar Jul 03 '15 05:07 ckrad

@ckrad 是的 统一配在config了

jyjin avatar Jul 03 '15 05:07 jyjin

@jyjin 你这样打包之后是识别不了模块的 在config里你配置的是别名 别名不是模块的id 所以打包之后seajs识别不了需要的模块的 你应该把文件路径作为id 如果使用fis加md5戳 你还需要把define里面的id也替换成加了md5戳 这个不能用__uri实现 如果一个文件包含自己的路径 这个路径在这个文件是不能被fis替换的 可以自己在加完md5戳之后 自己添加一个处理id的过程

ckrad avatar Jul 03 '15 08:07 ckrad

@ckrad 不打包的话是可以的,在fis confog提供的插件拓展接口中加上一段代码,去替换sea config中的文件名为时间戳文件名,可以成功,所以我索性就没打包了,呵呵

jyjin avatar Jul 03 '15 09:07 jyjin

@jyjin sea config里面的路径你直接用__uri就可以替换

ckrad avatar Jul 08 '15 02:07 ckrad

发了个 issues,貌似没什么搭理啊。 https://github.com/seajs/seajs/issues/1549

2betop avatar Jul 08 '15 02:07 2betop

目前我这边也是,除了部分打包不支持外,其他都通了。

2betop avatar Jul 08 '15 02:07 2betop