webpack中library的文档地址
我在文件src/index.ts
写了这样一个函数
function hello(name?: string) {
console.log(`hello ${name}`);
}
export default {hello};
export {hello};
因为我想在使用的时候做到
import MyLib from 'my-lib';
import {hello} from 'my-lib';
Mylib.hello();
hello();
webpack.config.js
module.exports = {
// xxx
output: {
// xxx
library: {
name: 'MyLib',
type: 'umd'
}
},
resolve: {
extensions: ['.js', '.ts']
},
module: {
rules: [
{
test: /\.ts$/,
use: ['babel-loader', 'ts-loader'],
exclude: /node_modules/
}
]
}
};
打包出来的文件是这样的
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["MyLib"] = factory();
else
root["MyLib"] = factory();
})(self, function() {
// xxxx
});
然后使用npm link
使用的时候就报错了
// SyntaxError: The requested module 'xxx' does not provide an export named 'default'
// SyntaxError: The requested module 'xxxx' does not provide an export named 'hello'
我理解的type: 'umd'
的情况下会使用name: 'MyLib'
定义我的模块,那我就可以直接使用MyLib.hello
?或者我有把具体的函数导出,那也可以使用具体的hello
?
请教一下大佬这一块怎么去理解?
解决了,问题关键确实在于
library
的type
字段,当type
为umd
的时候,这是文档的解释其实本质是我没有弄懂CommonJS、AMD这几种方式的区别,直接先说最后一种
作为全局变量工作
,其实从webpack打包的代码就应该看出来的,是一个iife
函数,所以其实直接import
进来就可以而下面的内容就是我的一点理解了,如有有误的地方可以指出来,因为毕竟问题就出在这里
CommonJs方式:CommonJs是用在服务器端的,如果在我这个里面应该是如下使用?
AMD方式:AMD就是使用在浏览器端的方式,如下是文档解释,可以理解为直接用是不行的,需要一个能兼容的库例如
RqeuireJs
等。使用的示例应该是这样?
那么话说回来,需要实现我问题中的那种使用该怎么去设置类型呢?我在文档发现了另一个类型
module
直接贴过来吧,这确实就是我提问的想用的方式,虽然还是处于实验性的,但是试验发现还是没问题的,本来想说这样折腾就用
rollup
多好,最后想想还是说菜鸡没有理由吧。