重学webpack4之打包库和组件

1,373 阅读1分钟

往期文章:

简介

  • webpack除了可以打包应用,也可以用来打包js库
  • 如果是纯js,个人更倾向于使用rollup

webpack方式

  • 不把所有第三方库打包进来,比如react啥的,webpack-node-externals
output: {
  path: path.resolve(__dirname, "lib"),
  filename: '[name].js',
  publicPath: './',
  libraryTarget: 'umd'
},
externals: [nodeExternals()]

打包一个小库,要求如下

  • 打包出两个文件,未压缩版和压缩版
  • 支持 ES module、commonjs、AMD
  • 使用压缩插件,terser-webpack-plugin,mode为production,webpack4会默认开启terser-webpack-plugin

index.js:入口文件

if (process.env.NODE_ENV === 'production') {
    module.exports = require('./lib/test.min.js');
} else {
    module.exports = require('./lib/test.js');
}

webpack.config.js

const TerserPlugin = require('terser-webpack-plugin');// 压缩插件

module.exports = {
    entry: {
        'test': './src/index.js',
        'test.min': './src/index.js'
    },
    output: {
        filename: './lib/[name].js',
        library: 'test',// 使用时 test.add()
        libraryTarget: 'umd',
        libraryExport: 'default'
    },
    mode: 'none', // 默认production
    optimization: {
        minimize: true,
        minimizer: [
            new TerserPlugin({
                include: /\.min\.js$/,
            })
        ]
    }
}

npm run build,产出物

  • test.js
  • test.min.js

rollup方式

package.json

"scripts": {
  "build": "rm -rf lib && rollup -c",
  "prepublish": "npm run build"
},

rollup.config.js

import babel from "rollup-plugin-babel";
import resolve from "rollup-plugin-node-resolve";
import commonjs from "rollup-plugin-commonjs";
import uglify from 'rollup-plugin-uglify';
import { minify } from 'uglify-es';

export default {
  input: "src/index.js",
  output: {
    name: 'Phone',
    dir: "lib",
    format: "es"
  },
  plugins: [
    babel({
      exclude: "node_modules/**"
    }),
    resolve({
      jsnext: true,
      main: true,
      browser: true,
    }),
    commonjs(),
    uglify({}, minify)
  ]
}

❤️ 加入我们

字节跳动 · 幸福里团队

Nice Leader:高级技术专家、掘金知名专栏作者、Flutter中文网社区创办者、Flutter中文社区开源项目发起人、Github社区知名开发者,是dio、fly、dsBridge等多个知名开源项目作者

期待您的加入,一起用技术改变生活!!!

招聘链接: job.toutiao.com/s/JHjRX8B