fis3 commonJs 中的 moduleId

作者: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')
})

原文链接:http://ivweb.io/topic/565c548a3ad940357eb99874

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏杂谈

关于《Node.js开发指南》

天天刷豆瓣,就盼着京东360有货到或者亚马逊有货到(最开始只有china-pub有货,但从亚马逊上下单要先付款RMB43.8--其中要多付10块钱的运费:(,...

782
来自专栏take time, save time

python 爬虫 入门 commit by commit -- commit2

代码你可以在https://github.com/rogerzhu/relwarcDJ 上得到,并且带有我完整的commit记录。

921
来自专栏FreeBuf

剖析CLDAP协议 Reflection DDoS

2018年上半年,得益于Memcache近5万的反射放大倍数,DDoS的峰值流量已经达到了一个前所未有的新高度—1.7Tbps,这也使得Memcache ReD...

1192
来自专栏张善友的专栏

Windows Live Writer工具

        Windows Live Writer是一款所见即所得的"博客"编辑器,它不仅仅是Live Spaces的好帮手,对其他流行的博客程序有着良好的...

1748
来自专栏杨建荣的学习笔记

一次数据变更的审核过程(r8笔记第95天)

今天正在做一个数据变更操作,突然一个开发的同学找到我,看起来比较着急的样子,说想让我做一个数据变更。 当然在这种时候,我正在做的数据变更操作已经被打断了...

2527
来自专栏Python中文社区

Github Python网页框架资源集合,包括Django、Flask、Tornado等

Django Django - Django。 Channels - Channels旨在增强Django的异步能力,同时让Django不仅仅局限于Reque...

6086
来自专栏iOS开发笔记

iOS开发照片框架详解(一)-- AssetsLibrary

1 概要 在 iOS 设备中,照片和视频是相当重要的一部分。最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法。在 ...

3747
来自专栏iOS开发笔记

ios开发照片框架详解(一)-- AssetsLibrary

1 概要 在 iOS 设备中,照片和视频是相当重要的一部分。最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法。在 i...

3469
来自专栏开源优测

[接口测试 - 基础篇] 02 你应该掌握的Python3接口测试内功

概述 本文主要介绍基于Python3进行接口测试时,应该掌握Python3哪些基本的能力,主要从以下几个方面进行说明。 Python3基本语法 ...

3206
来自专栏tkokof 的技术,小趣及杂念

小话游戏脚本(一)

( 题记:近来在网上学习到一个新的观点(应该是来自刘未鹏的BLOG :) ):书写是为了更好的学习,这与之前脑子里传道授业解惑的观点颇为迥异,品一品又颇以为然...

621

扫码关注云+社区