腾讯云技术社区-掘金主页持续为大家呈现云计算技术文章,欢迎大家关注!
作者:feix760
首先看一个有趣的问题
// fis-conf.js
fis.hook('commonjs')
.match('/modules/common/utils', {
isMod: true,
moduleId: 'utils' // 为utils设置一个moduleId,希望以后能直接require('utils')
})
.match('::package', {
postpackager: [
fis.plugin('loader', {
resourceType: 'commonJs'
})
]
})<!-- main.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!-- etc.. --->
<script>
require('utils')
</script>
</body>
</html>想象中理想的输出
<!-- main.html -->
<html>
<script src="/modules/common/utils.js"></script>
</html>// /modules/common/utils.js
define('utils', function() {
// ...
})实际结果
<!-- main.html -->
<html lang="en">
<!-- 不会有utils.js的引用,也就意味着fis并不能发现用moduleId直接引用的依赖 -->
<!-- script src="/modules/common/utils.js"></script-->
</html>// /modules/common/utils.js
define('utils', function() {
// ...
})解读
- 实际上moduleId只决定本身的define语句
- 要让fis识别出类似moduleId的短引用,可以配置commonJs的paths/packages映射
fis.hook('commonjs', {
paths: {
utils: '/modules/common/utils.js'
}
})- 寻找文件依赖是在lookup阶段完成,lookup阶段并不是一个包含所有文件的阶段,而是处理单个文件的阶段,因此没有所有文件moduleId的映射表。lookup函数需要返回两个信息: moduleId和fileId, moduleId用于替换require()语句( 注②),fileId加入依赖中,所以lookup返回的moduleId需和相关文件的moduleId一致,否则会出现以下错误:
define('lib/A.js', function() {
})<!-- main.html -->
<html>
<script>
require('modules/lib/A.js');
</script>
</html>注② lookup返回的moduleId
var A = require('lib/A.js')编译成:
define('XX', function() {
var A = require('modules/lib/A.js')
})相关推荐
Fibonacci Sequences in JavaScript with/without recursive
前端开发框架简介:angular和react
腾讯云CDN免费体验
此文已由作者授权腾讯云技术社区发布,转载请注明文章出处
原文链接:www.qcloud.com/community/a…
获取更多腾讯海量技术实践干货,欢迎大家前往腾讯云技术社区