Vue——10 - webpack打包保姆级教程01

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 打包js、json、css、less、html、背景图片以及图片、字体(Font)文件,devsever,生产环境配置以及css的兼容写法

一、webpack打包JS文件

注意:一定要先下载Node.js,webpack 必须在 NodeJS 下运行

如未下载则可从Vue——安装@vue/cli(Vue脚手架)的三种方式 进行查看并下载

首先呢先随便选个盘创建一个文件夹为webpack(名字可以自己定义),在文件夹中添加两个新文件夹scr以及dist

c538b9d06f3741198bba087bf7f8ebb9.png

按住win+r输入cmd调出控制台,输入正确路径

c47ae36c193147a682d77c30ee2ddaae.png

然后进行初始化:npm init

然后一直回车 ,直到重新出现目录

会发现多了个json文件

983d417260c940c890003238fbce6ef9.png

1a3aea92506743d0a5908c6e5e69c240.png

之后输入:

全局安装:
npm i webpack webpack-cli -g
本地安装:
npm i webpack webpack-cli -D

安装完成后会发现目录中多个文件夹

84121b59575f42b1873ea4665aac58db.png

在src文件夹中创建两个新的js文件

1.新建入口文件index.js和mathUtils.js,index.js是依赖于mathUtils.js

mathUtils.js代码部分如下:

//1.新建mathUtils.js,用CommonJs规范导出
function add(num1,num2) {
  return num1+num2
}
function mul(num1,num2) {
  return num1*num2
}
module.exports = {
  add,mul
}

index.js代码部分如下:

//2.新建入口js文件index.js 导入mathUtil.js文件,并调用
const {add,mul} = require("./mathUtils.js")
console.log(add(10,20))
console.log(mul(10,10))

完成后看下图:

c9a6a60662b7422697058c45413bf04d.png

2、然后使用webpack命令打包js文件

注意:webpack3使用下面的命令!!!

webpack ./src/index.js ./dist/bundle.js
webpack4及以上,使用cmd输入以下命令!!!
webpack ./src/index.js -o ./dist/bundle.js

ec2e15654da84c0794076b34744d7c3e.png

这里报红,可以换一种写法

找到所在目录,并删除bundle.js文件夹

2d1d1ab6fe404e53a2368814e4258200.png

然后输入以下命令:

如果是开发版就用开发环境:
webpack ./src/index.js -o ./dist --mode=development 
如果是用生产环境就使用这串代码:
webpack ./src/index.js -o ./dist --mode=production

!!    我们这里使用生产环境

086646eb165d4ec889252f851a568ae3.png

报绿即可。这样就会发现刚刚删除的地方只有一个main.js文件

eb9eaabb8d35494c9876e1b42c1d259d.png

这时就可以新建一个页面进行测试了:

在dist文件夹中创建一个index.html页面,把main.js引入即可

ab946cdedcf541f6883ed86e2cf7d71b.png

运行页面:

8a4a1ecd974045d89ed9bfbf1a1a8fe5.png

即可看到已经成功

二、打包JSON文件

第一种打包方法

例如:在src文件夹中新建一个data.json文件,并对其输入一些json的语法

56acc43a16d64328ab3589d941eed67e.png

然后在src文件夹中的index.js里写入
import data from "./data.json"
并打印data :
console.log(data);

df6c7ccca1ab4772bab6ab56a8f3c4de.png

重新打包一下即可:

webpack ./src/index.js -o ./dist --mode=production

f951e8c3de75460c9100833db559337e.png

此处就已经完成webpack的打包。

第二种打包方法:webpack打包

直接简写成这样也可以打包

99b943bb1f374e07969ea87eeabd7210.png

webpack可以帮我们打包js文件,只要指定入口文件(index.js)和输出的文件(bundle.js),不管是es6的模块化还是CommonJs的模块化,webpack都可以帮我们打包,还可以帮我们处理模块之间的依赖。

如果觉得--mode=development麻烦可以配置webpack.config.js的时候如下写

第三种打包方法:创建webpack.config.js

在最外层新建一个webpack.config.js文件

写入:

482ff9a7929148a9a0562159cb542596.png

代码如下:

const path = require('path');
module.exports = {
  entry: './src/index.js', //入口文件
  output: {
  path: path.resolve(__dirname, 'dist'), //动态获取打包后的文件路径,path.resolve拼接路径
  filename: 'main.js', //打包后的文件名
  },
    mode:'development'
}

cmd输入:

webpack

11f667c969904c2e9a2a6ec7dea68c5d.png

打印效果如下:

e82978b515ec46068fdbd435d9038996.png

第四种打包方法:使用自定义脚本(script)启动                ****(重要)

这里有两个生产环境

1、npm run dev//开发环境

2、npm run build//生产环境

这里使用生产环境也就是    npm run build

在package.json中的scripts中加上

"build": "webpack"

b2906db91a4242708b8d9dfc5a1f767d.png

使用npm run build进行打包

npm run build

097fe2552efa4a389f955e9554235c6b.png

再次输入:

ee4408e825e24e79b254a39724fd05bb.png

下面说一下如何打包css文件

三、打包css文件使用webpack的loader

什么是loader

loader是webpack中一个非常核心的概念。

webpack可以将js、图片、css处理打包,但是对于webpack本身是不能处理css、图片、ES6转ES5等。

此时就需要webpack的扩展,使用对应的loader就可以。

loader使用

步骤一:通过npm安装需要使用的loader

步骤二:通过webpack.config.js中的modules关键字下进行配置

大部分loader可以在webpack的官网找到对应的配置。

创建一个css文件:

7f21f4f7819c4817b2bf58b10cf89f68.png

引入链接:

600e9679c255454a8f32b9f63fa2b08b.png

在cmd中输入命令:

npm run build

1cb3743c8b1a4917a6ea5aa4190f3564.png

安装使用style-loader 以及 css-loader

npm install --save-dev style-loader css-loader

并在配置中添加loader

ee0dc32fe0f545f78cec3b67cd54f4e7.png

代码如下:

module: {
    rules: [
      {
        test: /\.css$/,//正则表达式匹配css文件
        //css-loader只负责css文件加载,不负责解析,要解析需要使用style-loader
        use: [{
          loader: 'style-loader'
        }, {
          loader: 'css-loader'
        }]//使用loader
      }
    ]
  }

这时重新加载命令即可:

c9f27c2e0cca405f8d63637fbcb78ea4.png

webpack使用多个loader是从右往左解析的,所以需要将css-loader放在style-loader右边,先加载后解析。

此时样式成加载解析到DOM元素上。

完整效果:

8d6d428fbdb744238e135f843f1616fa.png

四、对less文件进行打包

vscode不能直接对less进行解析,如需解析css则去下载插件easy less

6022cbcae3b041798165e8b727be4011.png

1、新建less文件b84b462952e04d7b877f83c1bf36906e.png

2、引入less

ebe8c9e772bf48db97f0ab4216fbe277.png

3、安装less-loader

npm install --save-dev less-loader less

c6b943917fcf4249aa563561ecb9b46c.png

4、在webpack.config.js中使用less-loader

module: {
    rules: [
      {
        test: /\.less$/,//正则表达式匹配css文件
        //css-loader只负责css文件加载,不负责解析,要解析需要使用style-loader
        use: [{
          loader: 'style-loader'
        }, {
          loader: 'css-loader'
        }, {
          loader: 'less-loader'//less文件loader
        }]//使用loader
      }
    ]
  }

如果css和less都需要打包则写下述代码即可:

module: {
    rules: [{
      test: [/\.css$/i, /\.less$/], //正则表达式匹配css文件
      //css-loader只负责css文件加载,不负责解析,要解析需要使用style-loader
      use: [{
        loader: 'style-loader'
      }, {
        loader: 'css-loader'
      }, {
        loader: 'less-loader' //less文件loader
      }] //使用loader//使用loader
    }]
  }

也可以写成:

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

如下图:

fcef0e7248e44ea89d6750797117d609.png

5、执行npm run build

显示效果

5a2dba88fae9419ea06b3b27d10beae9.png

五、打包背景图片

准备工作,准备两张图片,图片大小为一张8KB以下(名称为small.jpg),一张大于8KB(名称为big.jpg),新建一个img文件夹将两张图片放入。

1、这里在src中新建文件夹img,并把图片放在img文件夹中。并创建了一个css文件夹,将之前的css文件放入其中

aaa13cb2e76e4da2a35792f2f12be256.png

2、将背景图片引入normal.css文件里:

3165e381d25e455ebe32e780e59654de.png

3、其对应修改为

5b0721eff87a43f096e3c2dbc9506dde.png

4、在webpack.config.js中添加以下代码:

{
    test: /\.(png|svg|jpg|jpeg|gif)$/i,
    type: 'asset/resource',
    generator: {
      filename: 'images/[hash][ext][query]'
    }//把打包的图片放到images文件夹
    },
或者
module.exports = {
  mode: 'development',
  entry: './src/index.js', //入口文件
  output: {
  path: path.resolve(__dirname, 'dist'), //动态获取打包后的文件路径,path.resolve拼接路径
  filename: 'bundle.js', //打包后的文件名
   assetModuleFilename: 'images/[hash:8][ext][query]' //把打包的图片放到images文件夹
                                    // hash:8是把图片编译为八位数的哈希值
  },

这里使用了第一种方法:

fc77942ffb7646f4889c18a76c98c6ee.png

再次输入命令

npm run build

9b2df3e6ca6e4bcfb6f2565928a6b11b.png

这时就已经完成了打包,回到编辑器中查看,会发现多了个打包好的img里面是图片

e3fa0d6df5544805b1ef5864b93a8d56.png

再次打开index.html,

显示效果如下:

8461defa77624711bb26dc8beb6f836d.png

打包完成!

还有一种比较老的方法

安装使用url-loader处理图片

url-loader像 file loader 一样工作,但如果文件小于限制,可以返回 data URL 。(通常用于处理小图片)

npm install --save-dev url-loader

c93c8ec8e6194123aeb05b1d05325010.png

安装使用file-loader处理大图片

npm install --save-dev file-loader

fffd56afb091404485fde6fd4c59d8b3.png

然后对webpack.confid.js进行配置

{
        test: /\.(png|jpg|gif)$/i,
         //匹配png/jpg/gif格式图片
        use: [{
          loader: 'url-loader',
          options: {
            limit: 8192, //图片小于8KB时候将图片转成base64字符串,大于8KB需要使用file-loader
            esModule: false, //解决es6语法不识别 
            name: 'img/[name].[hash].[ext]',
          }
        }],
        type: 'javascript/auto'
      }

index.html一定要和下面的 webpack.config.js导出路径一致!!!!

9b288e9cba044630aa73bcc6cd333396.png

此时还需在src中新建一个index.html页面

acf234fc164f42afb6ece0309ae3d08c.png

dd898cbb88f643f48261aa1600c2a7a5.png

然后运行:

npm run build

即可成功

如果图片设置的为8KB以上的图片在dist中添加JS文件夹以及img文件夹

fcb351cba95c491bbff262fc29848c38.png

显示效果:

5c7aa073a12040a1b35f453c543db282.png

如果为8KB及以下的图片则只会出现一个JS文件,因为把img图片压缩在了JS文件夹下的main.js中

5a9aaa90375c479a97c32bb38682fadc.png

可以看到dist中并没有img文件夹在浏览器中打开会发现图片的格式已经被更改

97799a3b684541f6a0546ba68b51dc04.png

图片转换成base64格式的优缺点

1. 优点

(1)base64格式的图片是文本格式,占用内存小,转换后的大小比例大概为1/3,降低了资源服务器的消耗;

(2)网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。

(3)base64编码的字符串,更适合不同平台、不同语言的传输;

(4)算法是编码, 不是压缩, 编码后只会增加字节数,但是算法简单, 几乎不会影响效率,算法可逆, 解码很方便, 不用于私密信息通信;

(5)解码方便, 但毕竟编码了, 肉眼还是不能直接看出原始内容;

2. 缺点

(1)base64格式的文本内容较多,存储在数据库中增大了数据库服务器的压力;

(2)网页加载图片虽然不用访问服务器了,但因为base64格式的内容太多,所以加载网页的速度会降低,可能会影响用户的体验。

(3)base64无法缓存,要缓存只能缓存包含base64的文件,比如js或者css,这比直接缓存图片要差很多,而且一般HTML改动比较频繁,所以等同于得不到缓存效益。

下面再说一下打包字体和HTML

六、打包Font字体样式以及HTML

先从阿里巴巴字体图库中下载到本地

阿里巴巴矢量图标库

c97cbe2e2fa945aba572dc417e322c7d.png

选择已下载好的图标进行下载到本地

1bf2447a479f475793c5839113e34fe2.png

34d108f0e12443caacc9e1f1c4f99f8f.png

下载完成后有个文件夹

55226d8c91d54b9980dbf8c583083e5a.png

打开过后把框起来的文件放入src中的css文件夹以及新建的fonts文件夹

22d154ba83db416ab87d398d43c868d5.png

ac8bfb1c0b8f4b2b922da72f8b660739.png

更改iconfont.css中的路径:

49e65d012b0f48089187be848fef7af0.png

引入文件路径:

bd521481205b4dcbb4c36a7b319420b2.png

在src中添加一个index.html文件(之前忘了说,这里给补上) 并写入字体样式以及类名

334bb80fa1934875b441571ad0689020.png

使用cmd输入以下命令 来安装插件

npm install --save-dev html-webpack-plugin

dc39889cd2c249339b5ae60d24262b54.png

再webpack.config.js中添加以下代码

const HtmlWebpackPlugin = require('html-webpack-plugin');
  plugins: [new HtmlWebpackPlugin({
    template: './src/index.html'
  })],

打包资源:

{
        test: /\.(woff|woff2|eot|ttf|otf)$/i,
        type: 'asset/resource',
        generator: {
      filename: 'fonts/[hash][ext][query]'
    }
 },

打包完成后如下如所示:43a134625fd745b5beca2b20f585edff.png

删除dist文件夹中的所有文件或者直接删除dist即可

fb0eb1ce782c457da5a86863ea6c5c90.png

再次运行

npm run build

4dc812ae0e66443d926f553f3d50907b.png

完成后会自动生成之前删掉的所有文件

4fea84dfd6c74892b5a0f324ebc016fa.png

65f0ef492f2041dba4d486ead7ac29e1.png

效果如下:

f7c6bd87c3c34a3391522a2db3ab1153.png

七、devsever

npm install webpack-dev-server --save-dev
  devServer: {
    // 项目构建后路径
    // contentBase: resolve(__dirname, 'build'),
    // 启动gzip压缩
    compress: true,
    // 端口号
    port: 3000,
    // 自动打开浏览器
    open: true,
  },
  mode: 'development'
}

d01d6078bd824046929104c1f8e4c6c6.png

运行

npx webpack-dev-server

第一次进行yes以及y

运行结束后会自动为你打开浏览器并进行实时渲染

f2c882a1789147c7a4924c8ff9bb5bda.gif

接下来就可以测试一下更改css样式时浏览器会不会发生变化

2ce5f680dda8406c9c25498e965495f8.png

55bea3e99ece4b68b9a67db5ea1f6146.png

这里发现打包完这么多后并没有单独打包css文件夹(如下图),所以接下来将进行生产环境配置

2e789e1796bb495fa7281cd28521a50b.png

八、webpack生产环境配置

安装

npm install --save-dev mini-css-extract-plugin

620a14291f3f46c5b4439fe2e5764c53.png

const MiniCssExtractPlugin= require('mini-css-extract-plugin')//提取css成单独文件

在plugins中添加

new MiniCssExtractPlugin()

并使用MiniCssExtractPlugin.loader替换use里的'style-loader',

MiniCssExtractPlugin.loader

6298ed1fdfe64958957e3b71782f65bf.png

运行npm run build

fbbff2498db04338b8d2af3720bfa1d9.png

下图中会发现这里有个了css文件,但是并没有css文件夹

703852fe875a41859d10a5493aca4cd8.png

这时需在new MiniCssExtractPlugin()中添加以下代码

{
    filename:'css/build.css'  // 创建的文件夹以及css文件的名称
  })

并且把刚刚的main.css给删除

再次进行打包:

493db972a85f4019833a763179f92d2c.png

可以看到已经成功创建

c5d3a7bc69754fd3bd75527d5742f9ee.png

打开index.html也会正常显示

9bb0b7fed60f4a54b29cd06ff931d1a9.png

*九、css兼容性写法

这里主要是针对浏览器兼容样式的打包,例如(display:-webkit-flex样式),现在一般都支持ie9以上版本,基本用不到这一写法,但还是演示一下

首先先设置一下兼容样式

619b7cd866894c599e112d455dcd3d77.png

65b82f51018f470288c7fd1c8f2169a0.png

安装

npm install --save-dev postcss-loader postcss

c7145f8eca594433a30ca57a9b95b6d1.png

1774b2c1bdea44e59869269b83ef89c5.png

记住:一定不要不能出现注释 ,出现注释就会报错

56236ac14d65433c9a4af065f285fa3a.png

cf0c1914fa6e4e05ac70944880e0cf77.png

代码如下:

"browserslist":{
      "development": [
        "last 1 chrome version",
        "last 1 firefox version",
        "last 1 safari version"
      ],
      "production": [
        ">0.02%",
        "not dead",
        "not op_mini all"
      ]
    }

之后在webpack.config.js中添加以下代码

46b4f76a3ee64eb0884a3303f13c05b1.png

代码如下:

安装:npm install postcss-preset-env 
{
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [
                  [
                    'postcss-preset-env',  //这个需要安装npm install postcss-preset-env否则不能生效
                    {
                      // 其他选项
                    },
                  ],
                ],
              },
            },
          },

进行打包

npm run build

打包后会发现两个错误原因是less文件中没有把注释给去掉

86a96407e5b74c2dac4c8fc8d225f11b.png

046640e76dc94650bb48a39c1b614252.png

所以这里要把less中的注释去掉即可

ffae568706d7496a80a01e59f36a42d4.png

再次打包:

npm run build

015f85100b7444d8ac4dbbbca978e874.png

效果如下:


这里补充一点,上面忘了说。

十、html里的img标签里的图片如何打包

在webpack.config.js中添加以下代码:

{
    test: /\.html$/i,
    loader: "html-loader",
    },

703df69bd3404f8db2b3fe9194e7dbc5.png

记得安装插件

npm install --save-dev html-loader

c92616c4235a44b6bbfef35a4f29d913.png最后进行打包即可:

npm run build

523ed8098a614e0ea64235ea228d75c0.png



相关文章
|
2月前
|
缓存 监控 UED
升级 Vue3 时,如何减少打包体积的增加?
升级 Vue3 时,如何减少打包体积的增加?
239 59
|
2月前
|
API UED
升级 Vue3 后,项目的打包体积会有什么变化?
升级 Vue3 后,项目的打包体积会有什么变化?
139 57
|
1月前
|
JavaScript
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
这篇文章是关于如何在webpack环境中配置Vue.js,包括安装Vue.js、解决报错、理解el与template的区别、使用SPA模式、抽离模板为对象、封装为单独的js文件、安装vue-loader时遇到的问题及解决方案,以及整个过程的总结。
72 2
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
|
1月前
|
缓存 前端开发 JavaScript
Webpack 打包的基本原理
【10月更文挑战第5天】
|
1月前
|
前端开发 JavaScript
ES6模块化和webpack打包
【10月更文挑战第5天】
|
1月前
|
缓存 前端开发 JavaScript
深入了解Webpack:模块打包的革命
【10月更文挑战第11天】深入了解Webpack:模块打包的革命
|
1月前
|
JavaScript 前端开发
|
1月前
|
JavaScript
vue3完整教程从入门到精通(新人必学2,搭建项目)
本文介绍了如何在Vue 3项目中安装并验证Element Plus UI框架,包括使用npm安装Element Plus、在main.js中引入并使用该框架,以及在App.vue中添加一个按钮组件来测试Element Plus是否成功安装。
72 0
vue3完整教程从入门到精通(新人必学2,搭建项目)
|
1月前
|
JavaScript Java CDN
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
本文提供了Vue 3从入门到精通的完整教程,涵盖了创建Vue应用、通过CDN使用Vue、定义网站以及使用ES模块构建版本的步骤和示例代码。
170 0
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
|
1月前
|
缓存 前端开发 JavaScript
Webpack技术深度解析:模块打包与性能优化
【10月更文挑战第13天】Webpack技术深度解析:模块打包与性能优化
下一篇
无影云桌面