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 条评论
登录 后参与评论

相关文章

来自专栏数据库

ABP.Net Core Entity Framework迁移使用MySql数据库

一、迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下。 二、迁移M...

33710
来自专栏葡萄城控件技术团队

.Net 高效开发之不可错过的实用工具 工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内

工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管...

2016
来自专栏GuZhenYin

Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下Si...

3549
来自专栏逸鹏说道

.NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点

在将“.NET跨平台之旅”示例站点 about.cnblogs.com 从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0 (博文链接)之...

2749
来自专栏陈仁松博客

UWP基础教程 - 重启应用

开发过Winform应用的同学应该都知道,会有一些场景需要将应用重启,如:重新应用配置,崩溃,内存泄漏等情况。这个时候我们只要使用一行代码就可以实现重启。 Ap...

3427
来自专栏程序员的SOD蜜

64位系统使用Access 数据库文件的彻底解决方法

    最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32...

3035
来自专栏walterlv - 吕毅的博客

使用 Postman 调试 ASP.NET Core 开发的 API

发布于 2018-09-09 12:38 更新于 2018-09...

2973
来自专栏雨过天晴

原 用u盘制作mac安装盘

1374
来自专栏chafezhou

小说python中的孤儿进程

然而,在实际应用中,孤儿进程虽然不会给系统造成直接性的危害,但更多时候会对业务造成一些影响,如当子进程为一个基于tcp的socket服务时,会造成主进程再次启动...

841
来自专栏Java学习123

CentOS 6.5 开启Xmanager远程桌面登录

6309

扫码关注云+社区