编译 lodash 时没有被包裹,isMod 没有生效
Closed this issue · 10 comments
ystarlongzi commented
假设项目目录结构如下:
-- 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;
// ...........
- 编译后文件没有被包裹
- 多出上面两行代码
- 使用
fis3-hook-npm
编译正常
ystarlongzi commented
在编译时,会提示
Can't resolve
buffer
in file [/node_modules/lodash/lodash.js], did you missnpm install buffer
?
但是看 lodash 文件内容,并没有 require('buffer') 模块的相关的代码。。
2betop commented
lodash 里面应该有 Buffer 的用法,为了兼容默认为加
var Buffer = require("node_modules/buffer/index").Buffer;
有两种解决办法
- 安装
buffer
- 设置
shimBuffer
为 false
ystarlongzi commented
- 安装
buffer
安装buffer
后,本地我也有测试。但是 lodash 编译后的内容并没有被define
包裹,然后使用 requirejs 的话,如果require("node_modules/buffer/index")
就会报错。查了下 requirejs 的资料说,只有在define
内才可以require('xxxx')
,在define
外部,只能用require(['xxxx'])
- 设置
shimBuffer
为 false
测试方案可行
2betop commented
你的意思是,那段代码加到 define 外面去了是吧?那这就是问题,一会我修复。
ystarlongzi commented
编译后 lodash 文件内容是没有被包裹的,就是没有 define。。。
ystarlongzi commented
antd也有类似的问题,编译后会把 process
提到最前,最外层也没有 define
包裹,编译后内容如下:
var process = require('process/browser');
var global = typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
// ........
ystarlongzi commented
刚才又试了下,如果使用 fis3-hook-commonjs
,然后加载器使用 modJS
,就不会存在上面描述的问题了。。
2betop commented
嗯嗯,是同一个问题
2betop commented
只要把 fis.hook('node_modules') 放在 fis.hook('amd') 的前面就不会有问题了。
我再想想还有其他更好的办法没有。
2betop commented
或者用最新的 fis3-hook-node_modules@2.2.1