fis3-hook-module icon indicating copy to clipboard operation
fis3-hook-module copied to clipboard

怎么requirejs包装代码不太对requirejs是指amd包装方式没错吧

Open w2230030100 opened this issue 9 years ago • 24 comments

真正的写法

define(["**"],function(){
 “***”
});

工具包装后

define('test/m_a', function(require, exports, module) {
    return 1;
});

一个是没有中括号 一个是function内参数不对

w2230030100 avatar Jul 15 '15 06:07 w2230030100

目测你是用了 commonJs 的方法去解析的。请换成以下配置

fis.hook('module', {
    mode: 'amd',
    forwardDeclaration: true
});

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

这个是html文件代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script data-main="m_b" src="/common/static/lib/require.js"></script>

</head>
<body>
</body>
</html>

这个是m_b.js

alert(1)

这个是被wrap过的m_b.js代码

define('dakele/test/m_b', function(require, exports, module) {
/**
 * Created by ningfujun on 15/7/15.
 */

    alert(1);
});

为什么alert不出来1

w2230030100 avatar Jul 15 '15 06:07 w2230030100

别用 data-main 你用 <script> 主动调用吧

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

目前编译时不识别 data-main,依赖没有加载。

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

用script标签还是出不来alert1 目前代码如下 html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="/common/static/lib/require.js"></script>
    <script src="m_b.js"></script>
</head>
<body>
</body>
</html>

被wrap的js

define('dakele/test/m_b', function(require, exports, module) {
/**
 * Created by ningfujun on 15/7/15.
 */

    alert(1);
});

w2230030100 avatar Jul 15 '15 07:07 w2230030100

汗,module 只有在被 require 的前提下才会执行。

<script>
require(['/dakele/test/m_b.js]);
</script>

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

@2betop 额 突然脑残了 话说为什么/dakele/test/m_b.js被release之后路径就变成了dakele/test/m_b.js前面代表根路径的/没了

还有js文件还是有问题代码release出来是这样的

define('dakele/test/m_b', function(require, exports, module) {
/**
 * Created by ningfujun on 15/7/15.
 */

    alert(1);
});

我感觉应该是这样子的才对

define('/dakele/test/m_b.js',[], function() {
/**
 * Created by ningfujun on 15/7/15.
 */

    alert(1);
});

w2230030100 avatar Jul 15 '15 07:07 w2230030100

为了要让 module 可以打包合并,fis 产出的 moulde 都是署名的,而署名规则就是这样。那么 require 引用处,引用的路径要跟模块名对应上。

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

可以了吗? @w2230030100 ?

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

还是不行 有两个问题 一个是release获取不到正确的路径 比如这样 require(['/dakele/test/m_b.js'])被release之后路径就变成了dakele/test/m_b.js前面代表根路径的/没了 另外一个用您给的配置被wrap包装js代码requirejs不认 无法执行内部代码

w2230030100 avatar Jul 15 '15 09:07 w2230030100

  1. 我认为 module Id 没问题,带不带 '/' 应该都不收影响,因为 define 的 id 和 require 时的 ID 生成的都是一样的。
  2. 我觉得你说得有道理,在没有 deps 的情况下那个 [] 还是得生成。我已发布行版本的 module 你试试。[email protected]

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

稍等,改出问题了,等会

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

@w2230030100

先不说问题哈,我就说点需要关注的,以后就不需要对这些问题纠结了。

  • 关于 id 被改的事情

    require(['/x/b.js']);
    

    编译产出后

    require(['x/b'])
    

    其实这个修改明面上感觉是有问题的,但是其实这块的这个你不能理解为 url ,而应该理解为一个 id,就是对资源的唯一标识。

    但可能你发现你开发的时候确实谢了一个路径(url),而编译后变成了其他的东西。这就是工具存在的意义,开发是用路径好开发,构建后变成了一个其他的东西,这个我们称作 id,为了运行时方便。

    那么被改了,这样不就加载不了了吗,其实不然,我们的整个加载流程是依赖于 require.js 的 paths 设置。 比如对于上面的这个例子,paths 设置是这个样子的。

    require.config({
      paths: {
        'x/b': '/statc/x/b.js'
      }
    });
    

    require x/b.js 的时候其实会去读 paths 映射的地址来加载资源,加载过来以后,这个文件里包含的就是一个 define 包裹的组件。

    define('x/b', ....);
    

    require.js requirex/bdefine 的一致就正常工作了。

    所以当无法工作的时候,你需要关注编译产出后 require 和 define 的 ID 是否对得上。

  • 为什么这个事情做得这么奇葩,需要一张映射表来做 paths

    在前端研发中,源码路径必定无法完全跟线上一样,有了这个源码跟线上 url 的映射关系表,我们可以做很多事情,比如可以做一些组件的合并,或者是任意修改资源的线上请求 url,这是非常非常 nice 的一个功能。

    require.config(
      paths: {
        'a': 'pkg.js',
        'b': 'pkg.js'
      }
    );
    

oxUnd avatar Jul 15 '15 09:07 oxUnd

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

对不起啊 二位大神 还让你们破费了打字的时间 太sorry了 太sorry了 😂😂 是我第一次说路径问题的时候没有说清楚 其实是html里的

require(['这里的路径']);

当不用这个插件的时候没有任何问题当,使用了这个插件 /dakele/test/m_b被release之后路径就变成了dakele/test/m_b.js前面代表根路径的/没了 这样导致了我本来要指向的路径/dakele/test/m_b变成了/dakele/test/dakele/test/m_b导致加载的模块没有加载上

w2230030100 avatar Jul 15 '15 09:07 w2230030100

@xiangshouding 谢谢 这一块我却是不是太了解 多谢多谢😊😊

w2230030100 avatar Jul 15 '15 09:07 w2230030100

我大概知道原因了,你是否拉掉了 loader 插件?那个转换表是 fis3-hook-loader 生成的。

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

image 木有啊大神 只有一个fis3-postpackage-loader在github上

w2230030100 avatar Jul 15 '15 10:07 w2230030100

哈哈,居然是插件用错了,你用的是官方源吗?

oxUnd avatar Jul 15 '15 10:07 oxUnd

Sorry, It's https://github.com/fex-team/fis3-postpackager-loader

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

靠,请不要误导我,我脑子小。

oxUnd avatar Jul 15 '15 10:07 oxUnd

@w2230030100 怎么样?怎么样了?

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

恩,我已经在 模块加载框架里面去做这个path的适应了~

jincdream avatar Jul 17 '15 12:07 jincdream

@jincdream 不是,这个是 require.js 这么干的,可能别的不这么干,这个得按照对应的模块化框架来。

oxUnd avatar Jul 17 '15 13:07 oxUnd