fis3-hook-module
fis3-hook-module copied to clipboard
怎么requirejs包装代码不太对requirejs是指amd包装方式没错吧
真正的写法
define(["**"],function(){
“***”
});
工具包装后
define('test/m_a', function(require, exports, module) {
return 1;
});
一个是没有中括号 一个是function内参数不对
目测你是用了 commonJs 的方法去解析的。请换成以下配置
fis.hook('module', {
mode: 'amd',
forwardDeclaration: true
});
这个是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
别用 data-main
你用 <script>
主动调用吧
目前编译时不识别 data-main
,依赖没有加载。
用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);
});
汗,module 只有在被 require 的前提下才会执行。
<script>
require(['/dakele/test/m_b.js]);
</script>
@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);
});
为了要让 module 可以打包合并,fis 产出的 moulde 都是署名的,而署名规则就是这样。那么 require 引用处,引用的路径要跟模块名对应上。
可以了吗? @w2230030100 ?
还是不行 有两个问题 一个是release获取不到正确的路径 比如这样 require(['/dakele/test/m_b.js'])被release之后路径就变成了dakele/test/m_b.js前面代表根路径的/没了 另外一个用您给的配置被wrap包装js代码requirejs不认 无法执行内部代码
- 我认为 module Id 没问题,带不带 '/' 应该都不收影响,因为 define 的 id 和 require 时的 ID 生成的都是一样的。
- 我觉得你说得有道理,在没有 deps 的情况下那个
[]
还是得生成。我已发布行版本的 module 你试试。[email protected]
稍等,改出问题了,等会
@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 require的
x/b
和 define 的一致就正常工作了。所以当无法工作的时候,你需要关注编译产出后 require 和 define 的 ID 是否对得上。
-
为什么这个事情做得这么奇葩,需要一张映射表来做 paths
在前端研发中,源码路径必定无法完全跟线上一样,有了这个源码跟线上 url 的映射关系表,我们可以做很多事情,比如可以做一些组件的合并,或者是任意修改资源的线上请求 url,这是非常非常 nice 的一个功能。
require.config( paths: { 'a': 'pkg.js', 'b': 'pkg.js' } );
对不起啊 二位大神 还让你们破费了打字的时间 太sorry了 太sorry了 😂😂 是我第一次说路径问题的时候没有说清楚 其实是html里的
require(['这里的路径']);
当不用这个插件的时候没有任何问题当,使用了这个插件 /dakele/test/m_b被release之后路径就变成了dakele/test/m_b.js前面代表根路径的/没了 这样导致了我本来要指向的路径/dakele/test/m_b变成了/dakele/test/dakele/test/m_b导致加载的模块没有加载上
@xiangshouding 谢谢 这一块我却是不是太了解 多谢多谢😊😊
我大概知道原因了,你是否拉掉了 loader 插件?那个转换表是 fis3-hook-loader 生成的。
木有啊大神 只有一个fis3-postpackage-loader在github上
哈哈,居然是插件用错了,你用的是官方源吗?
Sorry, It's https://github.com/fex-team/fis3-postpackager-loader
靠,请不要误导我,我脑子小。
@w2230030100 怎么样?怎么样了?
恩,我已经在 模块加载框架里面去做这个path的适应了~
@jincdream 不是,这个是 require.js 这么干的,可能别的不这么干,这个得按照对应的模块化框架来。