美文网首页
Vue-Cli 2.0 和Vue-Cli 3.0 CDN和Gzi

Vue-Cli 2.0 和Vue-Cli 3.0 CDN和Gzi

作者: 前端小飞象 | 来源:发表于2021-02-23 11:11 被阅读0次

Vue-Cli 2.0 CDN和Gzip压缩

CDN

  • webpack.base.conf.js

'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}



module.exports = {
  // externals: {
  //     vue: 'Vue',
  //     element: 'ElementUI',
  // },
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
  node: {
    // prevent webpack from injecting useless setImmediate polyfill because Vue
    // source contains it (although only uses it if it's native).
    setImmediate: false,
    // prevent webpack from injecting mocks to Node native modules
    // that does not make sense for the client
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  },
  //添加开始
  externals: {
    'vue': 'Vue',
    'vue-router': 'VueRouter',
    'axios': 'axios',
    'vue-lazyload': 'VueLazyload',
    'element-ui': 'ELEMENT',
    '@antv/g2': 'G2',
    'clipboard': 'ClipboardJS',
    'js-cookie': 'Cookies',
    'vue-i18n': 'VueI18n',
    'qs': 'Qs',
    'vuex': 'Vuex'

  }
  //添加结束
}

  • webpack.dev.conf.js

   new HtmlWebpackPlugin(Object.assign(
      {
        filename: 'index.html',
        template: 'index.html',
        inject: true,
        favicon: path.join('favicon.ico')
      },
      config.dev.cdn
    )
    ),
  • webpack.prod.conf.js

  new HtmlWebpackPlugin(Object.assign({
      filename: config.build.index,
      template: 'index.html',
      inject: true,
      favicon: path.join('favicon.ico'),
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
      },
      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
      chunksSortMode: 'dependency'
    }, config.build.cdn)),
  • config/index.js

'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.

const path = require('path')

module.exports = {
  dev: {
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/mch-api': {
        // target: 'http://localhost:8080',
        target: 'http://10.0.0.248:8080/mch-api',
        changeOrigin: true,/* 允许跨域 */
        pathRewrite: {
          "^/mch-api": ""
        }
      },
    },
    // Various Dev Server settings
    host: 'localhost', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: false,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-

    /**
     * Source Maps
     */

    // https://webpack.js.org/configuration/devtool/#development
    devtool: 'cheap-module-eval-source-map',

    // If you have problems debugging vue-files in devtools,
    // set this to false - it *may* help
    // https://vue-loader.vuejs.org/en/options.html#cachebusting
    cacheBusting: true,

    cssSourceMap: true,
    //添加开始
    cdn: {
      js: [
        "https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js",
        "https://cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.js",
        "https://cdn.jsdelivr.net/npm/axios@0.19.0/dist/axios.min.js",
        "https://cdn.jsdelivr.net/npm/vue-lazyload@1.3.3/vue-lazyload.js",
        "https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.13.2/index.js",
        // "https://cdn.jsdelivr.net/npm/@antv/g2@4.0.15/lib/index.min.js",
        "https://cdn.jsdelivr.net/npm/@antv/g2@3.5.7/dist/g2.min.js",
        "https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js",
        "https://cdn.jsdelivr.net/npm/js-cookie@2.2.1/src/js.cookie.js",
        "https://cdn.jsdelivr.net/npm/vue-i18n@8.21.0/dist/vue-i18n.min.js",
        "https://cdn.jsdelivr.net/npm/qs@6.9.1/dist/qs.js",
        "https://cdn.jsdelivr.net/npm/vuex@3.0.1/dist/vuex.min.js",


      ]
      //添加结束
    }
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',

    /**
     * Source Maps
     */

    productionSourceMap: true,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',

    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    productionGzip: true,
    productionGzipExtensions: ['js', 'css'],

    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report,
    //添加开始
    cdn: {
      js: [
        "https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js",
        "https://cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.min.js",
        "https://cdn.jsdelivr.net/npm/axios@0.19.0/dist/axios.min.js",
        "https://cdn.jsdelivr.net/npm/vue-lazyload@1.3.3/vue-lazyload.min.js",
        "https://cdnjs.cloudflare.com/ajax/libs/element-ui/2.13.2/index.js",
        // "https://cdn.jsdelivr.net/npm/@antv/g2@4.0.15/lib/index.min.js",
        "https://cdn.jsdelivr.net/npm/@antv/g2@3.5.7/dist/g2.min.js",
        "https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js",
        "https://cdn.jsdelivr.net/npm/js-cookie@2.2.1/src/js.cookie.js",
        "https://cdn.jsdelivr.net/npm/vue-i18n@8.21.0/dist/vue-i18n.min.js",
        "https://cdn.jsdelivr.net/npm/qs@6.9.1/dist/qs.js",
        "https://cdn.jsdelivr.net/npm/vuex@3.0.1/dist/vuex.min.js",

      ]
    //添加结束

    }
  }
}

  • index.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>商户管理</title>
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>

<body>
  <div id="app"></div>
  <% for (var i in htmlWebpackPlugin.options.js&&htmlWebpackPlugin.options.js) { %>
  <script src="<%= htmlWebpackPlugin.options.js[i] %>"></script>
  <% } %>
</body>

</html>

GZIP

  • webpack.prod.conf.js 与webpackConfig同级添加以下

if (config.build.productionGzip) {
  const CompressionWebpackPlugin = require('compression-webpack-plugin')

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp(
        '\\.(' +
        config.build.productionGzipExtensions.join('|') +
        ')$'
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

  • config/index.js

//改为true
 productionGzip: true,

如果报错,可能是plugin版本太高,降低即可

 npm install --save-dev compression-webpack-plugin@1.1.12
  • 去掉所有的console

在 webpack.prod.conf.js 的 UglifyJsPlugin添加一句

compress:{
  warnings:false,
  //添加开始
  drop_console:true,
  pure_funcs:['console.log']
  //添加结束
}

Vue-Cli 3.0 CDN和Gzip压缩

  • vue.config.js

安装

npm i -D compression-webpack-plugin

引入

const CompressionWebpackPlugin = require('compression-webpack-plugin')
const path = require('path');

与devServer同级 添加

  configureWebpack: {
    // 使用CDN
    externals: {
      vue: 'Vue',
      'vue-i18n': 'VueI18n',
      axios: 'axios',
      'vue-router': 'VueRouter',
      vuex: 'Vuex',
      'element-ui': 'ELEMENT'
    },
    plugins: [
      new CompressionWebpackPlugin({
        filename: '[path].gz[query]',
        algorithm: 'gzip',
        // test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
        test: /\.(js|css)$/,
        threshold: 10240,
        minRatio: 0.8
      })
    ]
  }
  • index.html 在head中

  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vuex@3.1.2/dist/vuex.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vue-i18n@8.15.1/dist/vue-i18n.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
  <script src="https://cdn.bootcss.com/element-ui/2.4.11/index.js"></script>

相关文章

网友评论

      本文标题:Vue-Cli 2.0 和Vue-Cli 3.0 CDN和Gzi

      本文链接:https://www.haomeiwen.com/subject/rcrrfltx.html