fex-team/fis3-hook-node_modules

编译 lodash 时没有被包裹,isMod 没有生效

Closed this issue · 10 comments

假设项目目录结构如下:

-- page
    -- index.html
    -- xx.es6
    -- require.js

-- node_modules
-- fis-conf.js

page/xx.es6 内容如下:

var _ = require('lodash');

fis-conf.js 配置内容如下:

// 配置按需编译
fis.set('project.files', ['*.html', 'server.conf', 'test/**']);

// 配置 fis-components 安装目录
fis.set('component.dir', 'fis-components');

// 配置 server.conf 输出目录
fis.match('server.conf', {
    release: '/config/server.conf'
});

// 将 html 文件加入到 RESOURCE_MAP 中
fis.match('*.html', {
    useMap: true
});

// 模拟数据文件名不需要 MD5
fis.match('/test/**', {
    useHash: false,
    isMod: false
}, true);


// 扩展对『资源定位』的能力
fis.match('**.html', {
    parser: fis.plugin('html-uri')
});



fis.set('project.fileType.text', 'ts,es,es6');

fis.match('**.es6', {
    parser: fis.plugin('es6-babel'),
    rExt: '.js'
});

fis.match('{**.es6,**.js}', {
    isMod: true
});


fis.hook('amd',  {
    globalAsyncAsSync: false,

    forwardDeclaration: true,

    extList: ['.es6', '.js', '.jsx', '.es', '.ts', '.tsx']
});

fis.match('::packager', {
    postpackager: fis.plugin('loader', {
        resourceType: 'amd',
        useInlineMap: true
    })
});

fis.match('**/require.js', {
    isMod: false
});

fis.unhook('components');
fis.hook('node_modules');
//fis.hook('npm');

lodash 编译后的文件内容如下:

var global = typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
var Buffer = require("node_modules/buffer/index").Buffer;

// ...........
  1. 编译后文件没有被包裹
  2. 多出上面两行代码
  3. 使用 fis3-hook-npm 编译正常

在编译时,会提示

Can't resolve buffer in file [/node_modules/lodash/lodash.js], did you miss npm install buffer?

但是看 lodash 文件内容,并没有 require('buffer') 模块的相关的代码。。

lodash 里面应该有 Buffer 的用法,为了兼容默认为加

var Buffer = require("node_modules/buffer/index").Buffer;

有两种解决办法

  1. 安装 buffer
  2. 设置 shimBuffer 为 false
  1. 安装 buffer
    安装 buffer 后,本地我也有测试。但是 lodash 编译后的内容并没有被 define 包裹,然后使用 requirejs 的话,如果 require("node_modules/buffer/index") 就会报错。查了下 requirejs 的资料说,只有在 define 内才可以 require('xxxx'),在 define 外部,只能用 require(['xxxx'])
  2. 设置 shimBuffer 为 false
    测试方案可行

你的意思是,那段代码加到 define 外面去了是吧?那这就是问题,一会我修复。

编译后 lodash 文件内容是没有被包裹的,就是没有 define。。。

antd也有类似的问题,编译后会把 process 提到最前,最外层也没有 define 包裹,编译后内容如下:

var process = require('process/browser');
var global = typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};

// ........

刚才又试了下,如果使用 fis3-hook-commonjs,然后加载器使用 modJS ,就不会存在上面描述的问题了。。

嗯嗯,是同一个问题

只要把 fis.hook('node_modules') 放在 fis.hook('amd') 的前面就不会有问题了。

我再想想还有其他更好的办法没有。

或者用最新的 fis3-hook-node_modules@2.2.1