热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webpack在VUECLI3中的应用

构建基础篇:webpack在CLI3中的应用webpack作为目前最流行的项目打包工具,被广泛使用于项目的构建和开发过程中,其实说它是打包

构建基础篇:webpack 在 CLI 3 中的应用
webpack 作为目前最流行的项目打包工具,被广泛使用于项目的构建和开发过程中,其实说它是打包工具有点大材小用了,我个人认为它是一个集前端自动化、模块化、组件化于一体的可拓展系统,你可以根据自己的需要来进行一系列的配置和安装,最终实现你需要的功能并进行打包输出。而在 Vue 的项目中,webpack 同样充当着举足轻重的作用,比如打包压缩、异步加载、模块化管理等等。如果你了解 webpack 那么相信本文会让你更了解其在 Vue 中的使用,如果你是一个 webpack 小白,那么也没事,相信你会很容易的了解它在项目中的配置和功能。

webpack 的使用

  1. 与 vue-cli 2.x 的差异
    如果你使用过 vue-cli 2.x,那么你应该了解其构建出的目录会包含相应的 webpack 配置文件,但是在 vue-cli 3.x 中你却见不到一份关于 webpack 的配置文件,难道 3.x 抛弃了 webpack?其实不然,3.x 提供了一种开箱即用的模式,即你无需配置 webpack 就可以运行项目,并且它提供了一个 vue.config.js 文件来满足开发者对其封装的 webpack 默认配置的修改。如图:

  2. vue.config.js 的配置
    通过上方新老版本的对比,我们可以清晰的看出 vue.config.js 的配置项结构,如果你构建的项目中没有该文件,那么你需要在根目录手动创建它。下面我们就来介绍一下其常用配置项的功能和用途:
    a. baseurl
    在第一节《Vue CLI 3 项目构建基础》中我们通过 vue-cli 3.x 成功构建并在浏览器中打开 ​​http://localhost:8080/​​​ 展示了项目首页。如果现在你想要将项目地址加一个二级目录,比如:​​http://localhost:8080/vue/​​,那么我们需要在 vue.config.js 里配置 baseurl 这一项:
    // vue.config.js
    module.exports = {

    baseUrl: ‘vue’,


    }
    其改变的其实是 webpack 配置文件中 output 的 ​​publicPath​​ 项,这时候你重启终端再次打开页面的时候我们首页的 url 就会变成带二级目录的形式。
    b. outputDir
    如果你想将构建好的文件打包输出到 output 文件夹下(默认是 dist 文件夹),你可以配置:
    // vue.config.js
    module.exports = {

    outputDir: ‘output’,


    }
    然后运行命令 ​​yarn build​​​ 进行打包输出,你会发现项目跟目录会创建 output 文件夹, 这其实改变了 webpack 配置中 output 下的 ​​path​​ 项,修改了文件的输出路径。
    c. productionSourceMap
    该配置项用于设置是否为生产环境构建生成 source map,一般在生产环境下为了快速定位错误信息,我们都会开启 source map:
    // vue.config.js
    module.exports = {

    productionSourceMap: true,


    }
    该配置会修改 webpack 中 ​​devtool​​​ 项的值为 ​​source-map​​。开启 source map 后,我们打包输出的文件中会包含 js 对应的 .map 文件,其用途可以参考:​

​​Javascript Source Map 详解​​
d. chainWebpack
chainWebpack 配置项允许我们更细粒度的控制 webpack 的内部配置,其集成的是 ​​webpack-chain​​ 这一插件,该插件可以让我们能够使用链式操作来修改配置,比如:
// 用于做相应的合并处理
const merge = require(‘webpack-merge’);
module.exports = {

// config 参数为已经解析好的 webpack 配置
chainWebpack: config => {config.module.rule('images').use('url-loader').tap(options =>merge(options, {limit: 5120,}))
}...

}
以上操作我们可以成功修改 webpack 中 module 项里配置 rules 规则为图片下的 url-loader 值,将其 limit 限制改为 5M,修改后的 webpack 配置代码如下:
{

module: {rules: [{ /* config.module.rule('images') */test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,use: [/* config.module.rule('images').use('url-loader') */{loader: 'url-loader',options: {limit: 5120,name: 'img/[name].[hash:8].[ext]'}}]}]
}...

}
这里需要注意的是我们使用了 webpack-merge 这一插件,该插件用于做 webpack 配置的合并处理,这样 options 下面的其他值就不会被覆盖或改变。关于 webpack-chain 的使用可以参考其 github 官方地址:​

​​https://github.com/mozilla-neutrino/webpack-chain​​,它提供了操作类似 Javascript Set 和 Map 的方式,以及一系列速记方法。
e. configureWebpack
除了上述使用 chainWebpack 来改变 webpack 内部配置外,我们还可以使用 configureWebpack 来进行修改,两者的不同点在于 chainWebpack 是链式修改,而 configureWebpack 更倾向于整体替换和修改。示例代码如下:
// vue.config.js
module.exports = {

// config 参数为已经解析好的 webpack 配置
configureWebpack: config => {// config.plugins = []; // 这样会直接将 plugins 置空// 使用 return 一个对象会通过 webpack-merge 进行合并,plugins 不会置空return {plugins: []}
}...

}
configureWebpack 可以直接是一个对象,也可以是一个函数,如果是对象它会直接使用 webpack-merge 对其进行合并处理,如果是函数,你可以直接使用其 config 参数来修改 webpack 中的配置,或者返回一个对象来进行 merge 处理。你可以在项目目录下运行 ​

​​vue inspect​​ 来查看你修改后的 webpack 完整配置,当然你也可以缩小审查范围,比如:

只查看 plugins 的内容

vue inspect plugins
f. devServer
vue.config.js 还提供了 devServer 项用于配置 webpack-dev-server 的行为,使得我们可以对本地服务器进行相应配置,我们在命令行中运行的 ​​yarn serve​​​ 对应的命令 ​​vue-cli-service serve​​ 其实便是基于 webpack-dev-server 开启的一个本地服务器,其常用配置参数如下:
// vue.config.js
module.exports = {

devServer: {open: true, // 是否自动打开浏览器页面host: '0.0.0.0', // 指定使用一个 host。默认是 localhostport: 8080, // 端口地址https: false, // 使用https提供服务proxy: null, // string | Object 代理设置// 提供在服务器内部的其他中间件之前执行自定义中间件的能力before: app => {// `app` 是一个 express 实例}
}...

}
当然除了以上参数,其支持所有的 webpack-dev-server 中的选项,比如 ​​historyApiFallback​​​ 用于重写路由(会在后续的多页应用配置中讲解)、progress 将运行进度输出到控制台等,具体可参考:​​devServer​​以上讲解了 vue.config.js 中一些常用的配置项功能,具体的配置实现需要结合实际项目进行,完整的配置项可以查看:​

​​vue.config.js​​
3. 默认插件简介
通过对 vue.config.js 的了解,我们知道了 vue-cli 3.x 为我们默认封装了项目运行的常用 webpack 配置,那么它给我们提供了哪些默认插件,每一个 plugin 又有着怎样的用途呢?除了使用 ​​vue inspect plugins​​​ 我们还可以通过运行 ​​vue ui​​ 进入可视化页面查看,步骤如下:
• 打开可视化页面,点击对应项目进入管理页面(如果没有对应项目,需要导入或新建)
• 点击侧边栏 Tasks 选项,再点击二级栏 inspect 选项
• 点击 Run task 按钮执行审查命令

如图所示:
最后我们从输出的内容中找到 plugins 数组,其包含了如下插件(配置项已经省略,增加了定义插件的代码):
// vue-loader是 webpack 的加载器,允许你以单文件组件的格式编写 Vue 组件
const VueLoaderPlugin = require(‘vue-loader/lib/plugin’);
// webpack 内置插件,用于创建在编译时可以配置的全局常量
const { DefinePlugin } = require(‘webpack’);
// 用于强制所有模块的完整路径必需与磁盘上实际路径的确切大小写相匹配
const CaseSensitivePathsPlugin = require(‘case-sensitive-paths-webpack-plugin’);
// 识别某些类型的 webpack 错误并整理,以提供开发人员更好的体验。
const FriendlyErrorsPlugin = require(‘friendly-errors-webpack-plugin’);
// 将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件
const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);
// 用于在 webpack 构建期间优化、最小化 CSS文件
const OptimizeCssnanoPlugin = require(‘optimize-css-assets-webpack-plugin’);
// webpack 内置插件,用于根据模块的相对路径生成 hash 作为模块 id, 一般用于生产环境
const { HashedModuleIdsPlugin } = require(‘webpack’);
// 用于根据模板或使用加载器生成 HTML 文件
const HtmlWebpackPlugin = require(‘html-webpack-plugin’);
// 用于在使用 html-webpack-plugin 生成的 html 中添加 或 ,有助于异步加载
const PreloadPlugin = require(‘preload-webpack-plugin’);
// 用于将单个文件或整个目录复制到构建目录
const CopyWebpackPlugin = require(‘copy-webpack-plugin’);
module.exports = {
plugins: [
/* config.plugin(‘vue-loader’) */
new VueLoaderPlugin(),

/* config.plugin('define') */new DefinePlugin(),/* config.plugin('case-sensitive-paths') */new CaseSensitivePathsPlugin(),/* config.plugin('friendly-errors') */new FriendlyErrorsWebpackPlugin(),/* config.plugin('extract-css') */new MiniCssExtractPlugin(),/* config.plugin('optimize-css') */new OptimizeCssnanoPlugin(),/* config.plugin('hash-module-ids') */new HashedModuleIdsPlugin(),/* config.plugin('html') */new HtmlWebpackPlugin(),/* config.plugin('preload') */new PreloadPlugin(),/* config.plugin('copy') */new CopyWebpackPlugin()
]

}
我们可以看到每个插件上方都添加了使用 chainWebpack 访问的方式,同时我也添加了每个插件相应的用途注释,需要注意的是要区分 webpack 内置插件和第三方插件的区别,如果是内置插件则无需安装下载,而外部插件大家可以直接访问:​​https://www.npmjs.com/​​ 搜索对应的插件,了解其详细的 api 设置。
写在最后
本文主要阐述了 vue-cli 3.x 下基于 vue.config.js 配置 webpack 的主要方法,同时也介绍了其默认的 webpack 插件与主要功能,相信大家在了解 webpack 的知识后能够更加轻松的开展后续内容的学习,为接下来项目的构建和开发奠定基础。


推荐阅读
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
ddcall
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有