Vite 如何在 1 行代码内完成复杂的构建工具配置?

1,147 阅读5分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg

前言

我相信大家和我一样,在项目开发时,喜欢使用一些工具,来进行代码标记、预处理、代码检查工具和其他有助于我们编写更好代码的工具。不过,有些工具也会让我们感到很繁琐,例如配置像 Webpack 和 Babel 这样的复杂构建工具,我们貌似一直在学习,在探索,但还是没找到更好的方法,让Webpack 和 Babel配置起来更容易一点。

这些工具虽然功能很强大,Webpack 通过 loader 转换 JavaScript 代码后再使用 Babel 进行 ES6+ 转 ES5 的处理,但他们是我使用过的最难用的工具之一。我相信肯定有人不同意我的这一观点,觉得用的很得心应手。但我想有这种感觉的肯定不止我一个。

Vite配置更简单

下面我分享一个 Nuxt 项目的 Webpack 配置示例:

/* nuxt.config.js */
module.exports = {
  /*
   ** You can extend webpack config here
   */
  extend(config, { isDev, isClient, loaders: { vue } }) {
    /**
     * Transpile All Node Modules
     */
    const jsRule = config.module.rules.find((rule) => rule.test.test('.js'));
    // don't transpile babel helpers and core-js
    jsRule.exclude = /(core-js|babel)/;
    const babelOptions = jsRule.use[0].options;
    if (isClient) {
      // By default, babel will assume all modules are ES modules. This would
      // lead babel to inject ES imports even in commonjs files.
      // Source Type unambiguous forces babel to check each file individually
      // and decide whether it is commonjs or an ES module.
      babelOptions.sourceType = 'unambiguous';
    }

    /**
     * Allow vue-loader to transform assets in `data-srcset` and `data-src`
     * as well as `srcset` and `src`.
     *
     * @see https://dev.to/ignore_you/minify-generate-webp-and-lazyload-images-in-your-vue-nuxt-application-1ilm
     */
    if (isClient) {
      vue.transformAssetUrls.img = ['data-src', 'src'];
      vue.transformAssetUrls.source = ['data-srcset', 'srcset'];
    }

    /**
     * Allow Inline SVGs
     *
     * Nuxt has a single rule for all image types that uses `file-loader`.
     * This rule says "For SVG images with the inline parameter,
     * use `vue-svg-loader` instead."
     *
     * @see https://vue-svg-loader.js.org/faq.html#how-to-use-both-inline-and-external-svgs
     */
    const svgRule = config.module.rules.find((rule) =>
      rule.test.test('.svg')
    );
    svgRule.test = /\.(png|jpe?g|gif|webp)$/;
    config.module.rules.push({
      test: /\.svg$/,
      oneOf: [
        {
          resourceQuery: /inline/,
          use: [
            // babel loader is run after the svg files are transpiled into vue
            // components (webpack runs loaders bottom-to-top)
            {
              loader: 'babel-loader',
              options: babelOptions,
            },
            {
              loader: 'vue-svg-loader',
              options: {
                svgo: false,
              },
            },
          ],
        },
        {
          loader: 'file-loader',
          options: {
            esModule: false,
            name: 'assets/[name].[hash:8].[ext]',
          },
        },
      ],
    });

    /**
     * Run ESLint on save
     */
    if (isDev && isClient) {
      // eslint-disable-next-line global-require
      const ESLintPlugin = require('eslint-webpack-plugin');
      config.plugins.push(
        new ESLintPlugin({
          extensions: ['js', 'vue'],
        })
      );
    }
  },
},
};

是不是很长很长,看起来也很复杂,说实话,我都不想放在这,因为它占用了很大的篇幅。

但是信不信由你,这是一个相对简单的配置。但是,当出现问题时,试图弄清楚为什么以及如何解决它是非常繁琐的。

现在我们再来看看上面那个“简单”的 Webpack 配置,使用Vite就只有一行配置来加载插件以内联SVG,就这样简单的配置实现相同的功能。

/* nuxt.config.js */
import svgLoader from 'vite-svg-loader';
export default defineNuxtConfig({
  vite: {
    plugins: [svgLoader({ svgo: false })],
  },
});

与 Webpack 相比,Vite 非常易于使用。作为一个已经成熟的工具,它开箱即用地处理了我们开发中的大部分事情。使我们的配置文件很小很小。在许多情况下,它仅用于加载帮助 Vite 理解如何处理诸如 Vue 单文件组件或内联 SVG 之类的插件。例如这几个简单的副项目中,根本没有配置文件!

为什么我喜欢Vite

这就是为什么我对 Vite(发音为“veet”,法语中的“快速”)非常喜欢的原因。它是一个现代的开发环境和构建工具,可以完全取代 Webpack。它可以实现,比如它如何利用浏览器原生JavaScript 模块来支持依赖项预捆绑热模块替换,或者它最初创建是以加速 Vue,但现在它已转换为与框架无关的工具,并且在短短两年内就已经增长到每周超过 300 万次下载。真诚的希望你去看看 Vite 的功能页面

我想说的是,我认为Vite就是最好的工具,它对我的前端开发产生了很大的影响,几行代码就解决了复杂的构建工具配置,也让我爱上了前端开发:

  • Vite利用了现代浏览器的ES模块支持和开发服务器技术,能够实现超快的热重载和构建速度,从而提高开发效率。
  • 灵活的插件机制:Vite通过提供一系列易于扩展的API和插件机制,使得开发者可以自由地扩展和定制构建过程,从而实现更加灵活的构建流程。
  • 支持多种模块化规范:Vite不仅支持ES模块化规范,还支持CommonJS和AMD等其他模块化规范,使得开发者可以在同一个项目中混用不同的模块化规范。
  • 高质量的插件生态:Vite的插件生态非常丰富,涵盖了从CSS预处理器到自动化部署等各种方面,可以帮助开发者快速实现各种功能。

其实Vite 只关心入口文件——index.html位于你应用程序根目录的文件。从那里加载的任何 CSS 或 JS 文件都将由 Vite 处理。

  • 想使用 Sass 吗?使用 npm 安装 Sass,Vite 将自动处理您链接到的任何 Sass 文件。
  • PostCSS 怎么样?没问题!只需添加一个 PostCSS 配置文件,Vite 就会搞定。
  • 需要从 JSON 文件加载一些信息?可以做!Vite 允许您直接将其导入到您的 JS 文件中。
  • TypeScript?你说对了!只需使用*.ts扩展,Vue 将为您处理一切。

要是使用 Webpack 和 Babel 在项目中来完成所有这些事情,对于配置、插件和维护来说,简直是噩梦。

Vite 之所以伟大,有很多技术原因。但对我来说,它解决了前端开发中最痛苦的部分。归根结底,它简单并且高效。只需很少的配置,就能完成我想要的一切。简单来说就是加载文件,根据需要对其进行处理,然后让我就只用安心的编写代码了。

真的是太感谢 Vite 的出现了!

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接