rollup 打包对比webpack 打包

4,311 阅读2分钟

介于webpack 打包之后代码不精简,注入代码较多,没有使用的代码,也进行打包,导致体积变大,特意研究了rollup 打包js文件

1、rollup.config.js 打包配置

import resolve from 'rollup-plugin-node-resolve'
import babel from 'rollup-plugin-babel'
import commonjs from 'rollup-plugin-commonjs' 
import {uglify} from 'rollup-plugin-uglify'
import {minify} from 'uglify-js'
import vue from 'rollup-plugin-vue' 
import buble from 'rollup-plugin-buble'
import autoprefixer from 'autoprefixer'

const pathName = 'public/static/js/'
const config = []
const files = {
  '1.0.0/utils/index.js':'src/widget/utils.js',
  '1.0.0/polyfill/index.js': 'src/widget/polyfill.js',
  '1.0.0/ajax/index.js': 'src/widget/ajax.js',
  '1.0.0/store/index.js': 'src/widget/store.js',
  '1.0.0/request/index.js': 'src/widget/request.js',
  '1.0.0/validate/index.js': 'src/widget/validate.js',
  '1.0.0/filter/index.js': 'src/widget/filter.js',
  '1.0.0/loading/index.js': 'src/components/loading/index.js',
  '1.0.0/showModal/index.js': 'src/components/showModal/index.js',
  '1.0.0/toast/index.js': 'src/components/toast/index.js',
  '1.0.0/lazyLoad/index.js': 'src/components/lazyLoad/index.js',
  '1.0.0/swiper/index.js': 'src/components/swiper/index.js',
  '1.0.0/downloadApp/index.js': 'src/components/downloadApp/index.js',
  '1.0.0/header/index.js': 'src/components/header/index.js',
  'user/personal.js': 'src/pages/user/personal.js',
  'index.js': 'src/pages/index/index.js',

}

Object.keys(files).forEach((item) => {
  const configItem = {
    input: files[item],
    output: {
      format: 'iife',
      file: pathName + item
    },
    plugins: [
      alias({
        resolve: [".js", ".vue"],
        entries: [{ 
          find:'@', 
          replacement: path.resolve(__dirname, 'src') 
        }]
      }),
      commonjs(),
      vue({
        template: {
          isProduction: process.env.NODE_ENV == 'production' ? true : false
        },
        style: {
          postcssPlugins: [autoprefixer]
        }
      }),
      resolve(),
      babel({
        exclude: '**/node_modules/**'
      }),
      buble()
    ]
  }
  if (process.env.NODE_ENV == 'production') {
    configItem.plugins.push(uglify({}, minify))
  }
  config.push(configItem)
})

export default config

2、webpack.config.js 打包配置

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const path = require('path')
module.exports = {
  entry: {
  '1.0.0/utils/index':'./src/widget/utils.js',
  '1.0.0/polyfill/index': './src/widget/polyfill.js',
  '1.0.0/ajax/index': './src/widget/ajax.js',
  '1.0.0/store/index': './src/widget/store.js',
  '1.0.0/request/index': './src/widget/request.js',
  '1.0.0/validate/index': './src/widget/validate.js',
  '1.0.0/filter/index': './src/widget/filter.js',
  '1.0.0/loading/index': './src/components/loading/index.js',
  '1.0.0/showModal/index': './src/components/showModal/index.js',
  '1.0.0/toast/index': './src/components/toast/index.js',
  '1.0.0/lazyLoad/index': './src/components/lazyLoad/index.js',
  '1.0.0/swiper/index': './src/components/swiper/index.js',
  '1.0.0/downloadApp/index': './src/components/downloadApp/index.js',
  '1.0.0/header/index': './src/components/header/index.js',
  'user/personal': './src/pages/user/personal.js',
  'index': './src/pages/index/index.js',
  },
  output: {
    path: path.resolve(__dirname, './public/static/js'),
    filename: '[name].js'
  },
  module: {
    rules: [{
      test: /\.js?$/,
      loader: 'babel-loader',
      exclude: /node_modules/
    }, {
      test: /\.vue$/,
      loader: 'vue-loader'
    }, {
      test: /\.scss$/,
      use: ['style-loader', 'css-loader', 'sass-loader', 'postcss-loader']
    },{
      test: /\.(png|jpg|gif)$/i,
      use: [{
        loader: 'url-loader',
        options: {
          limit: 10000,
        }
      }]
    }]
  },
  resolve:{
    extensions:['*','.js','.json','.scss','.css'],
    alias: {
     '@': path.resolve('src')
    }
  },
  plugins: [
    new UglifyJsPlugin({
      parallel: 4,
      uglifyOptions: {
        output: {
          comments: false,
          beautify: true
        },
        compress: {},
        warnings: false
      },
      cache: true
    }),
    new VueLoaderPlugin()
  ]
}
执行命令
  "scripts": {
    "build": "sudo NODE_ENV=production rollup -c",
    "dev": "sudo rollup -c -w",
    "dev:webpack": "sudo webpack-cli --mode development --watch",
    "build:webpack": "sudo webpack-cli --mode production"
  }

3、.babelrc 配置

{
  "presets": [
    [
      "env",
      {
        "modules": false
      }
    ]
  ],
  "plugins": [
    "external-helpers"
  ]
}

4、package.json

  "devDependencies": {
    "@rollup/plugin-replace": "^2.2.0",
    "autoprefixer": "^9.7.1",
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-external-helpers": "^6.22.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "css-loader": "^3.0.0",
    "file-loader": "^4.2.0",
    "gulp": "^3.9.1",
    "gulp-autoprefixer": "^7.0.1",
    "gulp-htmlmin": "^5.0.1",
    "gulp-replace": "^1.0.0",
    "gulp-sass": "^4.0.2",
    "node-sass": "^4.12.0",
    "postcss-loader": "^3.0.0",
    "precss": "^4.0.0",
    "rollup": "^1.26.0",
    "rollup-plugin-alias": "^2.2.0",
    "rollup-plugin-babel": "^3.0.7",
    "rollup-plugin-buble": "^0.19.8",
    "rollup-plugin-commonjs": "^10.1.0",
    "rollup-plugin-html": "^0.2.1",
    "rollup-plugin-node-resolve": "^5.2.0",
    "rollup-plugin-postcss": "^2.0.3",
    "rollup-plugin-uglify": "^6.0.3",
    "rollup-plugin-vue": "^5.1.2",
    "sass-loader": "^7.3.1",
    "style-loader": "^0.23.1",
    "uglify-js": "^3.6.6",
    "uglifyjs-webpack-plugin": "^2.1.3",
    "url-loader": "^2.2.0",
    "vue-loader": "^15.7.0",
    "vue-template-compiler": "^2.6.10",
    "webpack": "^4.35.0",
    "webpack-parallel-uglify-plugin": "^1.1.0"
  }

两者区别

1、webpack 打包体积大,注入代码多,代码不精简,功能强大,社区活跃,使用人数多。

2、rollup 打包体积小,代码精简,较少注入,动态加载路由代码不能用,所以单页项目不合适,项目使用人不多,支持的插件较少。

3、rollup 对打包vue 文件,vue文件插件支持vue编译较少。

4、如有单独的js 基础类适合用rollup  打包,如有react/vue 打包建议用webpack,必要时 两者都用,也不错。

5、项目打包webpack 122kb  rollup 94.3kb  差别多了27.7kb 大小。