问题描述:
npm打包时需要注意哪些?如何利用webpack来更好的构建?
解题思路:
`Npm`是目前最大的 JavaScript 模块仓库,里面有来自全世界开发者上传的可复用模块。 你可能只是JS模块的使用者,但是有些情况你也会去选择上传自己开发的模块。 关于NPM模块上传的方法可以去
npm | build amazing thingswww.npmjs.com
上进行学习,这里只讲解如何利用webpack来构建。这里只讲解如何利用webpack来构建。
NPM模块需要注意以下问题:
1. 要支持CommonJS模块化规范,所以要求打包后的最后结果也遵守该规则。
2. Npm模块使用者的环境是不确定的,很有可能并不支持ES6,所以打包的最后结果应该是采用ES5编写的。
并且如果ES5是经过转换的,请最好连同SourceMap一同上传。
3. Npm包大小应该是尽量小(有些仓库会限制包大小)
4. 发布的模块不能将依赖的模块也一同打包,应该让用户选择性的去自行安装。
这样可以避免模块应用者再次打包时出现底层模块被重复打包的情况。
5. UI组件类的模块应该将依赖的其它资源文件,例如`.css`文件也需要包含在发布的模块里。
基于以上需要注意的问题,我们可以对于webpack配置做以下扩展和优化:
1.CommonJS模块化规范的解决方案: 设置output.libraryTarget='commonjs2'使输出的代码
符合CommonJS2 模块化规范,以供给其它模块导入使用;输出ES5代码的解决方案:
使用babel-loader把 ES6 代码转换成 2.ES5 的代码。再通过开启devtool: 'source-map'输出SourceMap
以发布调试。
3.Npm包大小尽量小的解决方案:Babel 在把 ES6 代码转换成 ES5 代码时会注入一些辅助函数,
最终导致每个输出的文件中都包含这段辅助函数的代码,造成了代码的冗余。解决方法是修改.babelrc文件,
为其加入transform-runtime插件
4.不能将依赖模块打包到NPM模块中的解决方案:使用externals配置项来告诉webpack哪些模块不需要打包。
5.对于依赖的资源文件打包的解决方案:通过css-loader和extract-text-webpack-plugin来实现,配置如下:
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
module: {
rules: [
{
// 增加对 CSS 文件的支持
test: /.css/,
// 提取出 Chunk 中的 CSS 代码到单独的文件中
use: ExtractTextPlugin.extract({
use: ['css-loader']
}),
},
]
},
plugins: [
new ExtractTextPlugin({
// 输出的 CSS 文件名称
filename: 'index.css',
}),
],
};