使用 Laravel Mix 时如何包含 webpack 插件?

Posted

技术标签:

【中文标题】使用 Laravel Mix 时如何包含 webpack 插件?【英文标题】:How to include webpack plugins when using Laravel Mix? 【发布时间】:2018-10-12 15:43:22 【问题描述】:

如果我使用 WebPack 和 Laravel Mix,我应该如何包含 webpack 插件?我很困惑我将插件代码添加到哪个文件中。

我的以下尝试似乎没有运行我的插件。插件应该是压缩js、css文件,但不是。

webpack.config.js:

  require('./node_modules/laravel-mix/src/index');
  require(Mix.paths.mix());

  // My plugin is here
  const CompressionPlugin = require('compression-webpack-plugin');

  Mix.dispatch('init', Mix);

  let WebpackConfig = require('./node_modules/laravel-mix/src/builder/WebpackConfig');

  module.exports = new WebpackConfig(
     plugins: [
      new CompressionPlugin(
        asset: "[path].gz[query]",
        algorithm: "gzip",
        test: /\.js$|\.css$|\.html$|\.svg$/,
        threshold: 10240,
        minRatio: 0.8
      )
    ],
  ).build();

webpack.mix.js:

  let mix = require('laravel-mix');

  mix.setPublicPath('dist')
     .js('src/app.js', 'scripts/')
     .extract([
        'jquery',
        'axios',
        'babel-polyfill',
        'lodash',
        'tether',
        'vue',
        'bootstrap-vue',
        'vuex',
        'vuex-localstorage',
     ])
     .sass('src/styles/app.scss', 'styles/')
     .copyDirectory('src/assets', 'dist/assets')
     .options(
        processCssUrls: false,
        uglify: true
      )
  .version();

我的 NPM 命令是:

node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=webpack.config。 js

【问题讨论】:

【参考方案1】:

Mix 的 API 提供了一个有用的 webpackConfig 方法来调整 webpack 配置。

https://laravel.com/docs/5.6/mix#custom-webpack-configuration

webpackConfig 方法接受一个对象,该对象应包含您希望应用的任何特定于 Webpack 的配置。

我相信下面的代码应该可以工作。

webpack.mix.js:

const mix = require('laravel-mix');
const CompressionPlugin = require('compression-webpack-plugin');

mix.setPublicPath('dist')
  .js('src/app.js', 'scripts/')
  .extract([
    'jquery',
    'axios',
    'babel-polyfill',
    'lodash',
    'tether',
    'vue',
    'bootstrap-vue',
    'vuex',
    'vuex-localstorage',
  ])
  .sass('src/styles/app.scss', 'styles/')
  .copyDirectory('src/assets', 'dist/assets')
  .options(
    processCssUrls: false,
    uglify: true,
  )
  .webpackConfig(
    plugins: [
      new CompressionPlugin(
        asset: '[path].gz[query]',
        algorithm: 'gzip',
        test: /\.js$|\.css$|\.html$|\.svg$/,
        threshold: 10240,
        minRatio: 0.8,
      ),
    ],
  )
  .version();

【讨论】:

我知道你在举一个例子,但压缩在 nginx 层处理得更好 @jarodh 值得注意的是,CompressionPlugin 块中的关键“资产”现在应该是“文件名”,否则构建会引发错误 我看到 uglify 在使用“脚本”或“babel”方法而不是“js”时不起作用。

以上是关于使用 Laravel Mix 时如何包含 webpack 插件?的主要内容,如果未能解决你的问题,请参考以下文章

laravel-mix-purgecss 和 Summernote

在 Laravel Mix 中使用 extract() 时 Vue 未加载

通过Mix将node_modules导入Laravel

如何配置 laravel-mix 以便能够将 @material 与 vue.js 一起使用

Laravel Mix 和 Turbolinks

如何在 Laravel Mix 中安装 Font Awesome