fis icon indicating copy to clipboard operation
fis copied to clipboard

requirejs和FIS如何结合使用

Open woshiwenzhijie opened this issue 10 years ago • 39 comments

目前项目中是用requirejs进行模块加载管理,用FIS进行压缩打包和MD5戳,目录结构如下: Uploading image.png… --js index.js --lib jquery.js require.js

我在index.html页面中: require(['index'],function(index){ index.init(); }); 如果我用FIS将jquery.js和require.js进行打包压缩,并且把index.js加上对应的md5,这时候require(['index']),这个引用的index.js并不是加上MD5戳的那个js,这个问题怎么解决? 如果我在index.js里头还引用了util.js,如果把util.js和index.js进行打包,会有问题吗? 最近一直被这个问题困扰着,麻烦指点一下,麻烦了,十分感激!

PS:之前使用的是seajs和FIS,但是seajs一直要对一些插件进行CMD化,有点麻烦,而且同样也有打包的问题,所以最近打算转require试试 PPS:seajs这个MD5戳的问题我之前问过了,已经解决了,不过打包问题还是存在

@nwind @asoiso @fouber @walterShen

woshiwenzhijie avatar Jul 09 '15 07:07 woshiwenzhijie

先不仿看看这个 demo https://github.com/fex-team/fis-amd-demo

md5 问题 和 pack 打包问题,目前实现方式是一样的。通过 require.config({path:{}}) 配置映射表来实现的。

2betop avatar Jul 09 '15 07:07 2betop

一个都没有 @ 对啊,你应该 @2betop 。

都困扰你那么久了,就没发现我们已经有 AMD 方案一年了吗?

oxUnd avatar Jul 09 '15 07:07 oxUnd

好的,我看看,谢谢哈 @2betop @xiangshouding 之前一直陷在业务里头啊,就将就将就用着,最近有点受不了了,所以。。。

woshiwenzhijie avatar Jul 09 '15 07:07 woshiwenzhijie

index.html中的这个两个:

运行FIS之后会添加相应的script标签和相应的map文件 这两个的在哪里做处理的?

woshiwenzhijie avatar Jul 09 '15 08:07 woshiwenzhijie

SCRIPT_PLACEHOLDER RESOURCEMAP_PLACEHOLDER 是这两个。。

woshiwenzhijie avatar Jul 09 '15 11:07 woshiwenzhijie

@2betop 你们在哪里对这两个变量进行了替换的?

index.html中

<script src="lib/require.js"></script>
<script src="config.js"></script>
<!--SCRIPT_PLACEHOLDER-->
<!--RESOURCEMAP_PLACEHOLDER-->
<script>
    require(['index'], function (index) {
        index.init();
    });
</script>

config.js中

requirejs.config({
    baseUrl: './js',
    paths: {
        jquery: '../lib/jquery-2.1.1'
    }
});

woshiwenzhijie avatar Jul 09 '15 12:07 woshiwenzhijie

@2betop 在吗? 请教一下

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

是纯前端项目吗?那是 autoload 插件自动替换的。

2betop avatar Jul 10 '15 07:07 2betop

恩,是纯前端项目 我参照你们的做法写了,发现不行,就是我上面贴的那些代码,fis-config.js里头有哪些特殊的配置吗?

fis-amd-demo在我这可以正常运行

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

<script src="lib/require.js"></script>
<script src="config.js"></script>
<!--SCRIPT_PLACEHOLDER-->
<!--RESOURCEMAP_PLACEHOLDER-->
<script>
    require(['index'], function (index) {
        index.init();
    });
</script>

执行fis release之后发现

<!--SCRIPT_PLACEHOLDER-->
<!--RESOURCEMAP_PLACEHOLDER-->

没有被替换掉

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

目测是你的 jquery 的 path 没有设置对,要精确到文件。你用了 autoload 插件了没有?

2betop avatar Jul 10 '15 07:07 2betop

用了autoload这个插件,用npm install -g了

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

贴下你的配置信息,光安装没用。

2betop avatar Jul 10 '15 07:07 2betop

有两个config,一个是关于requirejs的baseurl和paths的配置,config.js和fis-conf.js都在工程根目录下面 confis.js内容

requirejs.config({
    baseUrl: './js',
    paths: {
        jquery: '../lib/jquery-2.1.1'
    }
});

fis-conf.js的内容

// 开起 autuload, 好处是,依赖自动加载。
fis.config.set('modules.postpackager', 'autoload');
fis.config.set('settings.postpackager.autoload.type', 'requirejs');

// 设置成 amd 模式。
fis.config.set('modules.postprocessor.html', 'amd');
fis.config.set('modules.postprocessor.js', 'amd');
fis.config.set('settings.postprocessor.amd', {
    paths: {
        jquery: '/lib/jquery-2.1.1.js'
    }
});

index.html内容

<script src="lib/require.js"></script>
<script src="config.js"></script>
<!--SCRIPT_PLACEHOLDER-->
<!--RESOURCEMAP_PLACEHOLDER-->
<script>
    require(['index'], function (index) {
        index.init();
    });
</script>

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

目前的问题是,相应的map这个好像没有生成,还有一个就是打包的问题。 不过还没走到打包这一步就挂了。。。@_@

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

编译时有什么错误提示吗?

2betop avatar Jul 10 '15 07:07 2betop

有一个warning:[WARNI] Can not find module index in [/index.html]

这个warning也不是必现的,偶尔会出现,偶尔不会

woshiwenzhijie avatar Jul 10 '15 07:07 woshiwenzhijie

执行release server open进到release之后的目录查看之后,发现index.js已经加上了对应的MD5戳,可是index.html中的<!--SCRIPT_PLACEHOLDER--> <!--RESOURCEMAP_PLACEHOLDER-->这个替换符没有被替换掉

woshiwenzhijie avatar Jul 10 '15 08:07 woshiwenzhijie

查看生成的map.json

"js/index.js": {
            "uri": "/js/index_ca9cf25.js",
            "type": "js",
            "deps": [
                "jquery"
            ]
        }

这个是没有问题的 require.js是从fis-amd-demo里头复制过来的,最后有包含这一行require.jsExtRegExp = /^\/|:\/\/|\?/;

woshiwenzhijie avatar Jul 10 '15 08:07 woshiwenzhijie

我发现将index.html中的

require(['index'], function (index) {
        index.init();
    });

改成

require(['js/index'], function (index) {
        index.init();
    });

就可以引用到带有MD5戳的index.js,并且相应的两个替换符也被替换了,不过index.js里头就报错了 信息如下:

Uncaught Error: Mismatched anonymous define() module: function (require, exports, module) {
    var $ = require("jquery");
    var index = {
        "init": function () {
            console.log('gggasdfsfsd');
            $("#login").on("click", function () {
                console.log('hehehaaaa');
            });
        }
    }
    module.exports = index;
}

woshiwenzhijie avatar Jul 10 '15 09:07 woshiwenzhijie

好吧,是因为这边这个的正则没弄好

fis.config.set('roadmap.path', [
    {
        reg: /\/_[^\/]*?$/i,
        release: false
    },

    // 标记 isMod 为 true, 这样,在 modules 里面的满足 commonjs 规范的 js 会自动包装成 amd js, 以至于能在浏览器中运行。
    //
    {
        reg: /^\/js\/(.*\.js)$/i,
        isMod: true,
        release: '/js\/$1'
    }
]);

到这里为止,好像MD5的问题解决了。 我试试打包怎么处理。。。

woshiwenzhijie avatar Jul 10 '15 09:07 woshiwenzhijie

阿西吧。。。终于都可以了。。。

woshiwenzhijie avatar Jul 10 '15 09:07 woshiwenzhijie

请问一下,我现在使用的是knockout,现在require('knockout')进来时候一直报Mismatched anonymous define() module,它源码是这样封装的(function (){var debug = true;(function(undefined){}());})(); 这种情况应该怎么处理,急急急急急 。。。 @2betop

woshiwenzhijie avatar Jul 15 '15 06:07 woshiwenzhijie

Mismatched 是啥报出来的?

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

是require.js爆出来的

woshiwenzhijie avatar Jul 15 '15 07:07 woshiwenzhijie

@2betop 引用的KO的源码地址 http://knockoutjs.com/downloads/knockout-3.2.0.debug.js

woshiwenzhijie avatar Jul 15 '15 07:07 woshiwenzhijie

我这边试了, 不能重现你说的问题

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

能看下你的目录结构和对应的fis-conf.js的配置不?

woshiwenzhijie avatar Jul 15 '15 07:07 woshiwenzhijie

没改,就是 fis-amd-demo 中的。

image

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

稍等,我放到fis-amd-demo中试试

woshiwenzhijie avatar Jul 15 '15 07:07 woshiwenzhijie