一幅长文细学Vue(一)——Webpack打包工具

1 项目开发工具

摘要

​ 在本文中,我们会详细讨论webpack是如何打包发布项目,不过对于Vue来说,Vite可以做到和webpack一样的功能。

声明:如果想要看懂此文章,需具备node.js中npm的知识。

作者:来自ArimaMisaki创作

文章目录

  • 1 项目开发工具
    • 1.1 webpack工具
      • 1.1.1 什么是webpack
      • 1.1.2 安装配置webpack
      • 1.1.3 mode的可选值
      • 1.1.4 webpack.config.js文件的作用
      • 1.1.5 修改打包的入口
      • 1.1.6 webpack插件的使用
      • 1.1.7 访问自动打包生成的文件
      • 1.1.8 注意事项
      • 1.1.9 devServer节点
    • 1.2 loader加载器
      • 1.2.1 loader概述
      • 1.2.2 打包处理css文件
      • 1.2.3 打包处理less文件
      • 1.2.4 打包处理样式表中与url相关的文件
    • 1.3 打包发布
      • 1.3.1 为什么需要打包发布
      • 1.3.2 配置webpack打包发布
      • 1.3.3 整理dist目录下的文件
      • 1.3.4 自动删除dist目录下的旧文件

1.1 webpack工具

1.1.1 什么是webpack

说明:目前企业级的前端项目开发中,绝大多数的项目都是基于Webpack进行打包构建的。

主要功能:提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端Js的兼容性,性能优化等强大功能。


1.1.2 安装配置webpack

安装命令npm i webpack webpack-cli

配置

  1. 项目根目录创建webpack.config.js
  2. 将下面给的代码写入webpack.config.js来初始化配置
  3. 在package.json的scripts节点中加入键值对"dev":"webpack"用于运行webpack脚本
  4. 使用npm run dev来运行webpack脚本
  5. 运行脚本后出现dist目录,点开出现mian.js,这是webpack将有兼容性的代码转为没有兼容性的代码,我们在网页中应该导入改文件而非原来有兼容性的js文件。
module.exports = {mode:'development' //mode用来指定构建方式,可选值有development和production
}

1.1.3 mode的可选值

说明:mode可选值为developmentproduction

开发环境:development环境下不会对打包生成的文件进行代码压缩和性能优化,但打包速度快,适合在开发阶段使用

生产环境:production环境下会对打包生成的文件进行代码压缩和性能优化,但打包速度慢,适合在项目上线阶段使用


1.1.4 webpack.config.js文件的作用

说明:从配置文件的内容来看很有nodejs的味道,因为文件的内容采用了COMMONJS的语法。webpack是基于nodejs开发出来的打包工具,因此在它的配置文件中,支持使用nodejs相关的语法和模块进行webpack的个性化配置。

webpack.config.js是webpack的配置工具。webpack在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包。


1.1.5 修改打包的入口

说明:在webpack中常有如下的约定:

  1. 默认的打包入口文件为src->index.js
  2. 默认的输出文件路径为dist->main.js

修改:如果需要修改入口文件和输出文件路径及路径名,可以按如下配置(注意!这里采用了nodejs的知识内容,如果不懂就记配置就行了)

const path = require('path')module.exports = {mode:'development', //mode用来指定构建方式,可选值有development和productionentry:path.join(__dirname,'./src/index.js'), //指定打包入口output:{path:path.join(__dirname,'./dist'), //输出文件的路径filename:'bundle.js' //输出文件的名称}
}

1.1.6 webpack插件的使用

说明:如果想要将最新的配置生效,则需要使用命令npm run dev来重新生效配置。

升级!:我们可以通过安装和配置第三方插件,监听源码的改动,从而避免频繁使用打包指令。最常用的插件有如下两种:

  • webpack-dev-server:类似于nodemon工具。
  • html-webpack-plugin:webpack中的HTML插件,可以通过该插件定义index.html页面的内容。

安装配置webpack-dev-server

  1. 通过npm i webpack-dev-server -D安装
  2. 修改package.json中dev后的值为webpack serve
  3. 使用npm run dev开启实时打包

安装配置html-webpack-plugin:

  1. 通过npm i html-webpack-plugin -D安装
  2. 配置webpack.config.js
const path = require('path')const HtmlPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlPlugin({template:'./src/index.html',filename:'/index.html'
})module.exports = {mode:'development', //mode用来指定构建方式,可选值有development和productionentry:path.join(__dirname,'./src/index.js'), //指定打包入口output:{path:path.join(__dirname,'./dist'), //输出文件的路径filename:'bundle.js' //输出文件的名称},plugins:[htmlPlugin]// 挂载插件实例对象
}

1.1.7 访问自动打包生成的文件

疑问:开启自动打包后,在源码HTML中通过src的方式导入js,修改js后,发现修改后的效果和代码不一致。

回答:修改效果不一致是因为开启自动打包后的js文件并不处于真实物理磁盘中,而是存在于内存中。自动打包处于内存中可以提高实时打包输出的速度。

如何访问:实际上,webpack-dev-server生成到内存的文件默认放在了项目的根目录中,只不过它是虚拟且不可见的,但我们仍然能在html文件中引用它。

实时预览:webpack-dev-server提供了一个实时预览的服务器,我们通过http:localhost:8080可以访问。

image-20220820164433658


1.1.8 注意事项

疑问:html-webpack-plugin将src下的html复制一份到根目录下,可为何我们在编辑器中的文档树无法看到复制的html文件?

回答:该html文件也是置于内存中

疑问:既然通过两个插件生成的实时js文件和复制的html文件都处于内存中,那么删除dist文件夹还会影响项目吗?

回答:不影响


1.1.9 devServer节点

说明:在webpack.config.js配置文件中,可以通过devServer节点对webpack-dev-server插件进行更多的配置,如下:

devServer:{open:true, //打包完成后自动打开浏览器host:'127.0.0.1', //实时打包使用的主机地址port:80, //实时打包使用的端口号
}

1.2 loader加载器

1.2.1 loader概述

说明:实际开发中webpack默认只能打包处理以.js后缀名结尾的模块。其他非.js后缀名结尾的模块,webpack默认处理不了,需要调用loader加载器才可以正常打包,否则会报错。

作用:协助webpack打包处理特定的文件模块,如:

  • css-loader可以打包处理.css相关的文件
  • less-loader可以打包处理.less相关的文件
  • babel-loader可以打包处理webpack无法处理的高级js语法

调用过程示意图

image-20220820190242849


1.2.2 打包处理css文件

说明:如果想要在js文件中导入css文件,可以通过import语法导入,这正是webpack神奇之处。但在没有配置loader的情况下,当我们使用import语法导入后webpack会报错。

配置loader

  1. 通过npm i style-loader css-loader安装
  2. 在webpack.config.js的module->rules数组中添加loader规则,演示如下
  3. 其中test表示匹配的文件类型,采用正则匹配;use表示对应调用的loader,数组中指定的loader顺序固定不可改变,调用顺序从后往前调用
module.exports = {mode:'development', //mode用来指定构建方式,可选值有development和productionentry:path.join(__dirname,'./src/index.js'), //指定打包入口output:{path:path.join(__dirname,'./dist'), //输出文件的路径filename:'bundle.js' //输出文件的名称},plugins:[htmlPlugin],// 挂载插件实例对象module:{rules:[{test:/\.css$/,use:['style-loader','css-loader']} //采用正则表示loader来处理css后缀的文件]}
}

1.2.3 打包处理less文件

配置loader

  1. 通过npm i less-loader less安装
  2. 在webpack.config.js的module->rules数组中添加loader规则,演示如下
  3. 其中test表示匹配的文件类型,采用正则匹配;use表示对应调用的loader,数组中指定的loader顺序固定不可改变,调用顺序从后往前调用

说明:与cssloader不同的是,下载后use数组只需添加less-loader,无需添加less,因为less是内置依赖项。

module:{rules:[{test:/\.less$/,use:['style-loader','css-loader','less-loader']}]}

1.2.4 打包处理样式表中与url相关的文件

说明:在高版本的webpack实际上已经不需要再安装这个loader了,但是在1.3.3中整理dist目录下的img会用到,故这里提及。

配置loader

  1. 通过npm i url-loader file-loader安装
  2. 在webpack.config.js的module->rules数组中添加loader规则,演示如下
  3. 其中test表示匹配的文件类型,采用正则匹配;use表示对应调用的loader,数组中指定的loader顺序固定不可改变,调用顺序从后往前调用

提示:在组件中多次使用小图片会导致浏览器总是发出一些不必要的请求,这样会导致网页加载的速度变慢。我们可以将小图片格式转为base64格式,这样可以提高速度。使用?limit=22229可以将小图片转换为base64,意为体积小于等于给定的22229时,即可转为base64。

module: {rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] },{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },{test: /\.jpg|png|gif$/, use: {loader: 'url-loader',options: {limit: 22229,}}}]}

1.3 打包发布

1.3.1 为什么需要打包发布

说明:项目完成之后,使用webpack对项目进行打包发布的主要原因有以下两点:

  • 开发环境下,打包生成的文件存放于内存中,无法获取到最终打包生成的文件
  • 开发环境下,打包生成的文件不会对代码压缩和性能优化

1.3.2 配置webpack打包发布

说明:在package.json文件的script节点上新增build命令,命令中的–model为指定的参数项,指定production后,使用此命令可以覆改webpack.config.js中的model选项。配置如下所示:

  "scripts": {"build":"webpack --mode production"},

1.3.3 整理dist目录下的文件

js整理说明:如果我们想要在打包发布后,内存中的js文件出现在dist下的js文件夹内,那么我们需要在webpack.config.js配置文件的output节点中,修改filename的值为js/bundle.js

img整理说明:如果我们想要在打包发布后,内存中的img文件出现在dist下的img文件夹内,那么我们需要在webpack.config.js配置文件的output节点中,如下配置:

module: {rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] },{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },{test: /\.jpg|png|gif$/, use: {loader: 'url-loader',options: {limit: 22229,outputPath: 'image',}}}]}

1.3.4 自动删除dist目录下的旧文件

说明:在打包发布过程中,我们需要先删除开发时的dist,然后在运行命令打包发布,让内存中的文件构建dist。但我们可以再懒点,通过安装clean-webpack-plugin插件来自动清理dist目录下的旧文件。

安装配置

  1. npm i clean-webpack-plugin
  2. 在webpack.config.js中配置如下所示:
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const cleanPlugin = new CleanWebpackPlugin()plugins: [htmlPlugin,cleanPlugin],// 挂载插件实例对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I00005 打印直角三角形字符图案

曾经的计算机,没有显示屏,人们操作计算机时,用打印机记录执行的操作命令。 后来有了显示屏,不过最初的显示屏是字符频幕,输出只能是字符。 即使是今日,计算机已经进入多窗口图形界面时代,有时程…

动态数组使用

1 #include<stdio.h>2 #include<stdlib.h>3 4 int main()5 {6 int i;7 int n; //用于记录输入的整数的个数 8 int *p; //用于指向动态数组的存储空间 9 int sum0,average; //用于记录输入的整数的和与平均值 10 11 scanf("%d"…

Linux下安装Redis及搭建主从

Linux下安装Redis 首先在官网下载对应版本的redis包&#xff0c;这里本人使用的是redis-4.0.8.tar.gz。然后在服务器中存放redis包的路径下执行tar –vxf redis-4.0.8.tar.gz&#xff08;这里对应下载的包&#xff09;&#xff0c;解压redis后,cd 进入 redis-4.0.8&#xff08;…

图解安装CentOS 6.6

以下是在虚拟机上安装CentOS 6.6的过程。一、安装文件:CentOS-6.6-x86_64-bin-DVD.iso二、安装步骤# 虚拟机的配置这里省略&#xff0c;在百度上有很多帖子可以参考。开启虚拟机进入安装界面&#xff0c;如下图所示选择第一个选项&#xff0c;按Enter安装程序加载完后&#xff…

一幅长文细学Vue(三)——组件基础(上)

3 组件基础&#xff08;上&#xff09; 摘要 ​ 在本文中&#xff0c;我们将学习什么是SPA&#xff0c;以及Vue中组件的基本使用。 声明&#xff1a;为了文章的清爽性&#xff0c;在文章内部的代码演示中只会附上部分演示代码&#xff0c;main.js文件的代码通常不贴出&#xff…

综合练习:词频统计

下载一首英文的歌词或文章 将所有,.&#xff1f;&#xff01;’:等分隔符全部替换为空格 将所有大写转换为小写 生成单词列表 fopen(news.txt,r) newsf.read() f.close() sep,.!"?: for c in sep:newsnews.replace(c, )wordListnews.lower().split()for w in wordList:pr…

linux中fcntl()、lockf、flock的区别

fcntl()、lockf、flock的区别 ——lvyilong316 这三个函数的作用都是给文件加锁&#xff0c;那它们有什么区别呢&#xff1f;首先flock和fcntl是系统调用&#xff0c;而lockf是库函数。lockf实际上是fcntl的封装&#xff0c;所以lockf和fcntl的底层实现是一样的&#xff0c;对文…

iOS开发拓展篇—音频处理(音乐播放器6)

一、图片处理 说明&#xff1a; Aspect表示按照原来的宽高比进行缩放。 Aspectfit表示按照原来的宽高比缩放&#xff0c;要求看到全部图片&#xff0c;后果是不能完全覆盖窗口&#xff0c;会留有空白。 Aspectfill表示按照原来的宽高比缩放&#xff0c;但只能看到部分图片。引发…

词频统计预处理之综合练习

下载一首英文的歌词或文章 news , 生成词频统计 sep,.;:"" for c in sep:newsnews.replace(c, )wordlistnews.lower().split()wordDict{} for w in wordlist:wordDict[w]wordDict.get(w,0)1wordSetset(wordlist) for w in wordSet:wordDict[w]wordlist.count(w)f…

一幅长文细学Vue(五)——组件高级(上)

5 组件高级&#xff08;上&#xff09; 摘要 ​ 在本文中&#xff0c;我们会详细讨论watch侦听器的基本使用&#xff0c;并且了解vue中常用的生命周期函数、实现组件之间的数据共享&#xff0c;最后学习如何在vue3.x项目中全局配置axios。 声明&#xff1a;为了文章的清爽性&am…

流行的编程语言及其趋势

转&#xff1a;StackOverflow上的编程趋势 http://www.csdn.net/article/2013-07-08/2816144-StackOverflow-Programming-Trends 摘要&#xff1a;相信每个程序员都知道StackOverflow问答网站&#xff0c;本文作者dodgy_coder通过StackExchange Data Explorer Query收集了该网站…

CentOS7.0 安装 tomcat-9.0

2019独角兽企业重金招聘Python工程师标准>>> 1、解压 # tar -zxvf apache-tomcat-9.0.0.M4.tar.gz -C /opt/usr/local 改个名字好以后操作&#xff1a; # mv apache-tomcat-9.0.0.M4.tar.gz tomcat 2、启动&停止 # /opt/usr/local/tomcat/bin/start…

一幅长文细学华为MRS大数据开发(四)——HBase

4 HBase 摘要&#xff1a;HBase是一种非关系型数据库&#xff0c;它是基于谷歌BigTable的开源实现&#xff0c;和BigTable一样&#xff0c;支持大规模海量数据的存储&#xff0c;对于分布式并发数据处理的效率极高&#xff0c;易于扩展且支持动态伸缩&#xff0c;适用于廉价设备…

AOP技术基础

1、引言2、AOP技术基础 3、Java平台AOP技术研究4、.Net平台AOP技术研究2.1 AOP技术起源 AOP技术的诞生并不算晚&#xff0c;早在1990年开始&#xff0c;来自Xerox Palo Alto Research Lab&#xff08;即PARC&#xff09;的研究人员就对面向对象思想的局限性进行了分析。他们研…

TCP 协议的三次握手、四次分手

详细描述了 TCP 协议的连接和关闭的整个过程。解释了为什么 TCP 协议是面向连接的、可靠的数据传输协议。 TCP 在互联网上之间的通信交流&#xff0c;一般是基于 TCP (Transmission Control Protocol&#xff0c;传输控制协议) 或者 UDP (User Datagram Protocol&#xff0c;用…

[Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Discuss]Description 马上就是小苗的生日了&#xff0c;为了给小苗准备礼物&#xff0c;小葱兴冲冲地来到了商店街。商店街有n个商店&#xff0c;并且它们之间的道路构成了一…

Tiny框架2.0版火热推出

方法论 方法论决定了可以达到的高度 方法论&#xff0c;就是人们认识世界、改造世界的根本方法。 它是人们用什么样的方式、方法来观察事物和处理问题。概括地说&#xff0c;世界观主要解决世界“是什么”的问题&#xff0c;方法论主要解决“怎么办”的问题。 方法论是一种以解…

Java--Socket通信

下面内容是Java开发内容的高级知识点&#xff0c;需要对Java中的面向对象、IO、多线程、以及网络相关知识有一定的基础。(知识永远都有深度&#xff0c;本章节长期更新内容) 1、网络基础知识 网络通信的条件&#xff1a;1、两个通信的端都要有各自的IP地址作为唯一标识&#xf…

一幅长文细学华为MRS大数据开发(五)——MapReduce和Yarn

5 MapReduce和Yarn 摘要&#xff1a;本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce&#xff0c;包括MapReduce的原理、流程、使用场景&#xff0c;以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。 作者&#xff1a;来自ArimaMisaki创作…

Tensorflow从入门到精通之——Tensorflow基本操作

前边的章节介绍了什么是Tensorflow&#xff0c;本节将带大家真正走进Tensorflow的世界&#xff0c;学习Tensorflow一些基本的操作及使用方法。同时也欢迎大家关注我们的网站和系列教程&#xff1a;http://www.tensorflownews.com/&#xff0c;学习更多的机器学习、深度学习的知…