vue-cli 3.0 源码解读之 webpack4.0 篇

Vue-CLI 3.0 是一个用于快速搭建 Vue.js 项目的脚手架工具,它集成了大量的工具,其中包括 Webpack 4.0。在使用 Vue-CLI 3.0 搭建项目时,Webpack 扮演着非常重要的角色。在这篇文章中,我们将深入探讨 Vue-CLI 3.0 源码中的 Webpack 4.0 相关部分,带领读者了解 Webpack 4.0 的核心概念及其在 Vue-CLI 3.0 中的应用。

Webpack 4.0 简介

Webpack 是一个打包工具,它将一个或多个 JavaScript 文件打包成一个文件。随着前端技术的不断发展,Webpack 成为了前端构建工具中的重要一员。Webpack 3.x 版本已推出一段时间,而 2018 年 2 月 Webpack 4.0 正式发布,带来了许多新的特性和优化。

Webpack 4.0 和 Webpack 3.x 相比有以下几点改进:

  • Webpack 4.0 增加了模块类型,原先的模块类型是 commonjs、amd、umd、es6,新增了 system 以支持 SystemJS;
  • Webpack 4.0 默认启用了 production 模式,该模式下会自动开启 UglifyJsPlugin 和 ModuleConcatenationPlugin,实现代码压缩和模块拼接;
  • Webpack 4.0 优化了构建性能,减少了大量的无用代码,实现了构建速度的提升。

通过学习 Vue-CLI 3.0 的源码,我们将更深入地了解 Webpack 4.0 的改进和应用。

Vue-CLI 3.0 中的 Webpack 配置

Vue-CLI 3.0 中的 Webpack 配置非常强大,它可以根据用户不同的需求自动生成不同的配置。Vue-CLI 3.0 的 Webpack 配置文件位于项目的 node_modules/@vue/cli-service/lib/config 目录中,其中的配置项分为三种:

  • vue.config.js:用户自定义配置,包括 devServer、publicPath、outputDir 等;
  • webpack.config.js:Webpack 配置,包括 entry、output、mode、module、plugins 等;
  • chainWebpack.js:一些高级配置,可以通过 API 修改 Webpack 的配置。

下面我们将逐个解析这些配置文件。

vue.config.js

vue.config.js 位于项目根目录下,可以通过它来自定义 Vue-CLI 3.0 的配置,例如应用的端口号、代理设置、打包输出路径等。示例代码如下:

-------------- - -
  ---------- -
    ----- -----
    ------ -
      ------- -
        ------- -------------------------
        ------------- -----
        ------------ -
          -------- --
        -
      -
    -
  --
  ---------- ------
-

这段代码中的配置项 devServer 可以设置开发服务器的参数,包括 port 端口号和 proxy 代理设置,其中 proxy 代理还可以通过 pathRewrite 对路径进行重写。outputDir 是打包生成的文件路径,这里设置为 dist 目录。

webpack.config.js

Webpack 是 Vue-CLI 3.0 中最重要的构建工具,webpack.config.js 中存放着 Webpack 的各种配置。Webpack 的核心配置是 entry、output、module、plugins 等,我们将逐一讲解。

entry

entry 是 Webpack 构建的入口文件。在 Vue-CLI 3.0 中,entry 是通过 @vue/cli-service 中的 getServicePaths 函数来获取的,示例代码如下:

----- ------- - ---------------------------------------
----- ------- - --- ----------------------------------- -- --------------

----- ----- - ------------------------

-------- --------------- --------- -
  ----- --------------- - --------------
    ----------------------------- ------------------
  -
  ----- -------------- - ---------------
    - ----------------------------- ------------------
    - ----------------------------- ----------------
  ----- ------ - ----------------------- -- --

  ----- ---------------- - ----------------------- -- -------------
  ----- ------------ - ------------------- -- ----------------------

  ----- ----- - ------------- -- -------------------------- -- ----------------------

  -- ------- ----- --- -------- -- --------------------- -
    ------ ------------------------------ -------
  -

  ------ ------------------------------- ---- -- -
    --- --- - ----------
    -- ------- --- --- -------- -- ------------------- -
      --- - -----
    -
    --------------- -- -
      -------------------------------------- ---
    --
    ------ ---
  -- ---
-

这段代码中的 getServicePaths 函数会判断用户是否使用了旧的配置(即 config/index.jsvue.config.js),如果用户使用了旧的配置,那么 entry 就是通过 Config 类来获取的。

output

output 是 Webpack 打包后生成的文件的路径和文件名。在 Vue-CLI 3.0 中,output 的路径和文件名都是自动生成的。示例代码如下:

-------------- - -
  ---------- -------
  ---------- ---------
  ---------------- -----
  ---
-

这里的 outputDir 代表打包生成的文件在哪个目录下,assetsDir 代表该目录下的静态资源所在的目录,filenameHashing 表示文件名是否需要进行哈希,避免浏览器缓存问题。

module

module 是处理项目中的各种文件类型的规则,例如处理 CSS 时使用的 css-loaderstyle-loader,以及处理 ES6 语法的 babel-loader。在 Vue-CLI 3.0 中,module 配置项是通过 @vue/cli-service 中的 resolveModule 函数获取的,示例代码如下:

----- ------- - ---------------------------------------
----- ------- - --- ----------------------------------- -- --------------

----- ------- - ------------------------------

-------------- - --------------

这段代码中的 resolveWebpackConfig 函数会读取根目录下的 vue.config.js 文件和 @vue/cli-service 中的内置配置,根据这些配置生成 Webpack 配置。

plugins

plugins 是 Webpack 中的插件,用于增强 Webpack 的功能。在 Vue-CLI 3.0 中,插件也是通过 @vue/cli-service 中的 resolveWebpackConfig 函数获取的,示例代码如下:

----- ------- - ---------------------------------------
----- ------- - --- ----------------------------------- -- --------------

----- ------- - ------------------------------

-------------- - ---------------

这段代码中的 options.plugins 返回的是一个数组,包含了 Webpack 配置中所用到的所有插件。常用的插件有 html-webpack-plugincopy-webpack-pluginuglifyjs-webpack-plugin 等。

chainWebpack.js

Vue-CLI 3.0 中的 Webpack 配置项非常强大,但有时候我们需要更加高级的配置,此时就需要使用 chainWebpack.js 了。chainWebpack.js 中包含了一些高级的配置项,例如优化打包后的文件大小和性能、优化异步加载模块的方式等。

示例代码如下:

-------------- - -------- -- -
  ----------------------------
  ------------------------------------ - --------
  -------------------------
    ------------------
    ------------ -- -
      ---------------------------------- - ----------
    --
-

这段代码中的配置项有三个。第一个配置删除了 hmr 插件,即 HMR(Holt Module Replacement)模块热更新插件;第二个配置将 splitChunks 插件中的 chunk 名称重命名为 vendor;第三个配置修改了规则,将 vue-loader 的选项中的 whitespace 修改为 condense。这些配置项可以通过 config 参数来修改。

总结

Vue-CLI 3.0 是一个非常强大的脚手架工具,其中集成了 Webpack 4.0。Webpack 4.0 性能优化和改进实现了更快的打包构建和更好的代码压缩。在 Vue-CLI 3.0 的配置中,vue.config.jswebpack.config.jschainWebpack.js 都有着非常重要的作用。通过对这些配置的深入解读,我们可以更好地了解 Webpack 4.0 的核心概念及其在 Vue-CLI 3.0 中的应用。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6534dbbc7d4982a6eba401eb


猜你喜欢

  • Enzyme 测试代码覆盖率的提高方法

    Enzyme 是 React 组件测试库的一种。通过 Enzyme 可以模拟 React 组件并对其进行测试。在进行React组件测试时,测试覆盖率是一个重要的指标,可以帮助开发人员发现未被覆盖的代码...

    1 年前
  • 解决在 Deno 中无法读取 JSON 文件的问题

    Deno 是一款类型安全的 JavaScript 和 TypeScript 运行时,它基于 V8 引擎和 Rust 语言实现。Deno 具有许多出色的特性,包括安全性、实时重载、内建工具和模块等等,但...

    1 年前
  • Cypress 测试中 mock 请求的使用实例

    在使用 Cypress 进行前端自动化测试时,与后端接口的交互是一个重要的测试点。然而在测试时直接向后端接口发起请求往往是不可避免的,这会使测试变得缓慢、不可靠,依赖后端的质量、网络状况等因素。

    1 年前
  • SASS 中注释的使用方法

    在前端开发中,注释是一个很重要的部分,它有助于提高代码的可读性和维护性。在 SASS 中,我们也可以使用注释来帮助我们更好地阐述样式表的信息,以及帮助我们进行团队协作。

    1 年前
  • 在 Web Components 中应用 JavaScript 模块化的方法探索

    Web Components 是一种可重复使用的组件化开发方式,使得开发者可以将组件封装为自定义元素,在需要时将其插入到网页中。由于每个组件都是独立的,所以它们与页面的其他部分隔离开来,不会与其他组件...

    1 年前
  • Tailwind CSS 实现字体图标的方法

    在前端开发中,字体图标的使用越来越普遍,因为他们具有优美的外观,更小的文件大小,易于使用和灵活性等优点。Tailwind CSS 是一个流行的 CSS 框架,它提供了许多工具来开发美观的用户界面。

    1 年前
  • 使用 Chai 和 Mocha 进行接口测试时遇到的测试数据准备问题解析

    自动化测试是前端开发中必不可少的一环,而接口测试是其中一项重要的测试类型。使用 Chai 和 Mocha 进行接口测试时,测试数据的准备是十分关键的,本文主要讨论测试数据准备过程中遇到的问题及解决方式...

    1 年前
  • Mongoose 中使用 $pull 操作符进行数组元素的删除操作及示例

    Mongoose 是一个 Node.js 环境下的 MongoDB 驱动程序,可以轻松地连接、操作 MongoDB。如果您正在使用 Mongoose 操作 MongoDB,可能会遇到需要删除数组中的元...

    1 年前
  • Serverless 框架下的 Lambda 函数错误处理

    Serverless 架构使得应用开发人员能够更加专注于业务逻辑和功能开发,而无需关注底层基础设施的管理和维护。在 Serverless 架构下,Lambda 函数是最基础和核心的构件。

    1 年前
  • Docker 容器化 OpenLDAP 服务实践

    随着云计算和DevOps的流行,容器化技术已经成为当今IT行业最热门的领域之一。Docker是目前最常用的容器化引擎之一,它可以让你轻松地部署和运行应用程序。在容器化这个话题上,有些企业会选择使用LD...

    1 年前
  • Node.js 如何处理 JSON 数据

    在现代的前端开发中,JSON 已经变得非常普遍。Node.js 作为前端领域中的一个重要工具,自然离不开对 JSON 的应用。在本文中,我们将探讨 Node.js 中处理 JSON 数据的方法和技巧,...

    1 年前
  • 在 Jest 中使用 Sinon.js 进行测试的示例

    简介 近年来,前端开发已经从一种简单传统的“文艺青年”工作变成了一项极具挑战的行业。为了保证代码的质量,开发人员需要编写完整、可靠的测试集以确保其代码的可靠性和正确性。

    1 年前
  • Fastify 中间件的实际应用:增加效率并优化性能

    Fastify 是一个快速、高效的 Web 应用程序框架。在进行开发时,我们通常需要使用一些中间件来增强 Fastify 的功能。本文将介绍 Fastify 中间件的实际应用,并探讨如何使用中间件来增...

    1 年前
  • 如何使用 Webpack 打包 JavaScript 动态模块

    Webpack 是一个用于打包 JavaScript 的工具,也是前端领域里使用最广泛的打包工具之一。通过使用 Webpack,我们可以将 JavaScript 文件合并在一起,减少页面的请求次数,同...

    1 年前
  • ES9 中的异步迭代器

    在 ES9 中,新增了异步迭代器(Async Iterator)的功能,它可以为异步操作提供一个更加方便的遍历机制。在本文中,我们将深入探讨 ES9 中的异步迭代器,包括它的定义、使用方法以及示例代码...

    1 年前
  • Sequelize 中如何查询部分数据

    在 Sequelize 中,查询数据是非常常见的操作。但是,有时候我们需要查询的是一部分数据而不是整个数据表,这时候该怎么做呢?这篇文章将为大家详细介绍 Sequelize 中如何查询部分数据。

    1 年前
  • Redux 和 React 组件通信的最佳实践

    在 React 前端开发中,组件之间的通信一直是一个很重要的话题。Redux 是一个常用的状态管理库,与 React 配合使用可以更好地管理组件之间的通信。本文将介绍 Redux 和 React 组件...

    1 年前
  • Angular 中如何创建可重用的动画

    在 Angular 中,动画是前端开发中非常重要的一部分。但是,在开发过程中,我们经常需要在多个组件中使用相同的动画效果,这就需要我们创建可重用的动画。 在本文中,我们将讨论如何在 Angular 中...

    1 年前
  • 基于 OpenMP 的多线程性能优化实践

    随着处理器核心数量的增加和并行计算的应用越来越广泛,多线程编程已经成为现代编程的一个重要方向。在前端开发中,通过并行化的方式可以提高页面加载速度和用户体验,因此多线程技术在前端开发中的应用也越来越重要...

    1 年前
  • PM2 常见错误:如何解决 PM2 启动应用程序后出现 400 Bad Request 错误

    在使用 PM2 进行应用程序启动时,很多人可能会遇到 400 Bad Request 错误。这个错误通常是由于应用程序出现问题而导致的,但出现问题的原因却有很多。在本文中,我们将探讨 PM2 启动应用...

    1 年前

相关推荐

    暂无文章