使用webpack5搭建vue3项目过程记录(详细注解)

2023-11-02

在开始搭建之前,首先理清楚webpack的五大核心概念
1)entry(入口)
指示 Webpack 从哪个文件开始打包

2)output(输出)
指示 Webpack 打包完的文件输出到哪里去,如何命名等

3)loader(加载器)
webpack 本身只能处理 js、json 等资源,其他资源需要借助 loader,Webpack 才能解析

4)plugins(插件)
扩展 Webpack 的功能

5)mode(模式)
主要由两种模式:

  • 开发模式:development
  • 生产模式:production
  1. 初始化项目–生成项目描述文件
npm init -y

会生成package.json(项目描述文件)

ps:如果不加-y的话,会需要自己输入项目名称等,加上-y会自动生成。

  1. 安装webpack
npm i webpack webpack-merge webpack-cli -D

ps:
-D 等价于 --save-dev; 开发环境时所需依赖

-S 等价于 --save; 生产环境时所需依赖

webpack-merge 这个是用来合并webpack配置文件的,比如一般项目有三个webpack配置文件,一个基础的用于打包图片样式等,一个生产环境的,一个开发环境的.开发环境就需要把基础配置文件合并进来再export

webpack-cli 可以让你在命令行中调用webpack

执行命令之后会生成node_modules(存放node包管理工具下载安装的包)和package-lock.json(该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被 100% 复制)

这里如果已经搭建了git仓库 要记得加gitignore,不然所有node_modules都上传的话太大了

在这里插入图片描述

在这里插入图片描述

  1. 初始化目录和文件

新建文件和文件夹
在这里插入图片描述

index.html

<!DOCTYPE html>
<html lang="">
  <body>
    <div id="app"></div>
  </body>
</html>

创建 webpack.common.js 文件用于编写 webpack 的基本配置

// webpack.common.js
const path = require("path"); // 引用path模块

module.exports = (env) => {
  // 入口文件
  return {
    entry: "./src/main.js",
    output: {
      // 输出的文件名称
      filename: "[name].js",
      // 输出的路径 是绝对路径(导入path模块) 这里是用node来做的
      path: path.resolve(__dirname, "../dist"),
    },
  };
};

创建webpack.prod.js 用于编写生产环境下的配置

const { merge } = require('webpack-merge'); 
const common = require('./webpack.common.js'); 
module.exports = env =>{ 
   let pro_config = { 
     mode:'production', 
   } 
   return merge(common(env),pro_config) //合并配置 }

在package.json文件当中添加build

"scripts": { 
"build": "webpack --config build/webpack.prod.js --mode production"
},

现在的配置就可以运行啦
输入npm run build ,会执行webpack.prod.js文件,
在prod配置文件里,借助merge插件,会把webpack.common.js中的配置也进行执行

生成新的文件

上面就把基本的配置都配置好啦,后续还要对需要使用的插件进行配置

  1. 创建html模板文件 html-webpack-plugin

HtmlWebpackPlugin 可以让打包后的JS自动引入html文件中

安装依赖

npm i html-webpack-plugin -D

在webpack.common.js文件里配置,因为这个依赖在生产和开发环境都需要用到。

const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = (env) => {
  // 入口文件
  return {
    //...
    plugins: [
      new HtmlWebpackPlugin({
        template: path.join(__dirname, "../public/index.html"),
        filename: "index.html", //输出的文件名
      }),
    ],
  };
};

配置好之后,npm run build,再去查看dist目录下面的index.html, 我们可以发现打包后的文件已经自动引入了。

  1. ES6语法转换 bable-loader

安装babel核心 、对应loader 以及预置环境

安装依赖

npm i @babel/core babel-loader @babel/preset-env -D

在webpack.common.js rules中增加

//...
      module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: "babel-loader",
            options: {
              presets: ["@babel/preset-env"],
            },
          },
        },
      ],
    },
  1. 样式处理

如果项目当中的有使用less的话,也需要配置

安装依赖

npm i  style-loader css-loader less less-loader -D

在webpack.common.js rules中增加

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

ps:多loader加载顺序 是从下到上 从左到右,所以这里的顺序一定不能错哦~

至此我们已经处理完前端三大件 HTMl JS CSS,完成了一个网页组成的基本条件,但只是这些远远不够,接下来我们继续完善 静态资源/vue3/ts/代码规范/多环境 等配置

在浏览器中查看index.html,页面可以正常显示,但是每次修改都需要手动刷新,为了解决这个问题,可以安装本地服务DevServer。

  1. 本地服务服务DevServer webpack-dev-server

实现本地开发服务器

安装依赖

npm i webpack-dev-server -D

在webpack.dev.js中修改相关配置

webpack5中的devserver和webpack4还是有不同的,建议去阅读一下文档。

const { merge } = require("webpack-merge");
const common = require("./webpack.common.js");

module.exports = (env) => {
  //...
  let dev_config = {
    mode: "development",
    devServer: { 
      contentBase: path.join(__dirname, "../dist"),
      compress: true,
      port: 9000,
      open:"http://localhost:" + port,//打开指定窗口
      proxy: { //代理 在前后端联合开发中很重要 将前端请求转发到目标服务器上
        "/api": {
          target: "http://www.xxx.com:8080/api",//调用后端的数据
          secure: true, // 如果是https接口,需要配置这个参数
          changeOrigin: true, //是否为每个静态文件启动gzip压缩
          pathRewrite: { "^/finchinaAPP": "" },
        },
      },
    },
  };

  return merge(common(env), dev_config); //合并配置
};

修改 package.json 新增scripts,通过CLI 调用 webpack-dev-server

"scripts": {
    "serve": "npx webpack serve --mode development"
  }

npm run build 和 npm run serve 之后,我们就可以在终端看见本地服务的地址啦。
现在修改一下index.js中的代码内容,看看会不会自动刷新。

  1. vue-loader

vue-loader当然就是对vue代码进行转换,让浏览器能够识别。

安装依赖:

npm install vue@next -S 
npm install vue-loader@next @vue/compiler-sfc

在webpack.common.js中添加相关配置

const path = require("path");
const { VueLoaderPlugin } = require('vue-loader')

module.exports = (env) => {
  return {
    entry: "./src/index.js", //入口文件
    output: {
      // 输出的文件名称
      filename: "[name].js",
      // 输出的路径 是绝对路径(导入path模块) 这里是用node来做的
      path: path.resolve(__dirname, "../dist"),
    },
    plugins: [
      new VueLoaderPlugin(),
    ],
    module:{
      rules:[
          {
              test:/\.vue$/,
              loader:'vue-loader'
          },
          // 它会应用到普通的 `.js` 文件以及 `.vue` 文件中的 `<script>` 块
      ]
  }
  };
};

  1. 静态资源(图片,字体,音频等)

资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外loader

webpack5中常用的资源模块类型(asset module type)

  • asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
  • asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。

自定义输出文件名的两种方式:

// 默认情况下,asset/resource 模块以 [hash][ext][query] 文件名发送到输出目录。
// 有两种方式
// 第一种 在output里配置 assetModuleFilename
module.exports = {
    // ...
  output: {
    // ...
    assetModuleFilename: 'images/[hash][ext][query]'
  }
}
// 第二种 在指定资源 generator 里配置 filename
module.exports = {
  module: {
    rules: [
      {
       test: /.html/,
          type: 'asset/resource',
        generator: {
          filename: 'static/[hash][ext][query]'
        }
        }
    ]
  }
}

在webpack.common.js中修改配置

module.exports = {
  module: {
    rules: [
           {
          test: /\.(png|jpe?g|gif|svg)$/,
          type: "asset",
          parser: {
            dataUrlCondition: {
              maxSize: 10 * 1024, // 10kb  指定大小 小于该值则使用inline模式
            },
          },
        },
        {
          test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)$/,
          type: "asset",
          parser: {
            dataUrlCondition: {
              maxSize: 10 * 1024, // 10kb  指定大小
            },
          },
        },
        {
          test: /\.(woff2?|eot|ttf|otf)$/,
          type: "asset",
          parser: {
            dataUrlCondition: {
              maxSize: 10 * 1024, // 10kb  指定大小
            },
          },
        },
    ]
  }
}

这里基本的功能都可以实现啦,如果有需要typescript eslint之类的可以接着进行配置。

现在我们就可以往index.js和App.vue中编写内容啦。

//index.js
import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);

app.mount("#app");
<template>
</template>
<script setup>
</script>
<style>
</style>

参考文章

[1] https://zhuanlan.zhihu.com/p/407379037

[2] https://juejin.cn/post/7034810358795599880#heading-0

[3] https://juejin.cn/post/6979876149966929934#comment

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用webpack5搭建vue3项目过程记录(详细注解) 的相关文章

随机推荐

  • Python 的画图函数 seaborn 简介

    seaborn 简介 seanborn 是 Python 的另外一个常用工具包 它基于 matplotlib 但画出的图形更加美观些 并且与 Pandas 的数据类型结合地较好 Import seaborn import seaborn a
  • win服务器系统授权,win服务器系统授权

    win服务器系统授权 内容精选 换一换 为了更加安全高效的使用云监控服务提供的主机监控功能 我们提供了最新方式的Agent授权方法 在安装主机监控Agent前 仅需要一键式单击该区域的授权按钮或者在创建弹性云服务器页面勾选云监控Agent委
  • 观测线程状态

    package com kuang Demo05 观察线程的状态 public class TestState public static void main String args Thread thread new Thread gt
  • JAVA模拟堆

    堆的性质 堆是一种特殊的树 只要满足以下两点 它就是一个堆 堆是一个完全二叉树 堆中每一个节点的值都必须大于等于 或小于等于 其子树中每个节点的值 第一点 堆必须是一个完全二叉树 完全二叉树要求 除了最后一层 其他层的节点个数都是满的 最后
  • Android 性能优化之资源图

    目前很多美工图都是把切给IOS的图丢给Android开发 然后苦逼的Android开发就拿着这一套图进行撸 殊不知此时的地雷已经悄悄埋好 等待着有缘人去踩 梳理一下变成雷的原因 个人拙见 假如美工给了我们一套xxhdpi的资源图 我们将这张
  • postgis各版本离线包下载

    下载地址https www postgresql org ftp postgis
  • 基于顺序存储结构的图书信息表的创建和输出

    基于顺序存储结构的图书信息表的创建和输出 描述 定义一个包含图书信息 书号 书名 价格 的顺序表 读入相应的图书数据来完成图书信息表的创建 然后统计图书表中的图书个数 同时逐行输出每本图书的信息 输入 输入n 1行 其中前n行是n本图书的信
  • 设计模式——外观模式

    一 外观模式 1 1 概述 在现实生活中 常常存在办事较复杂的例子 如办房产证或注册一家公司 有时要同多个部门联系 这时要是有一个综合部门能解决一切手续问题就好了 有些人可能炒过股票 但其实大部分人都不太懂 这种没有足够了解证券知识的情况下
  • windows+vscode+git+github 保姆级使用教程

    windows vscode git github 保姆级使用教程 关于git和github 抛开官方定义 这里通俗地解释下他们的关系 我们常用github这个网站来存取代码 基本存取的方式是git 更便捷的存取的方式是vscode 举个例
  • 【实验报告】实验三 交换机的配置

    实验三 交换机的配置 第一个实验 用两台思科2960交换机构建如下拓扑结构的局域网 作业 1 请同学们参照上诉完成对另外一个交换机的相关配置 也划分初 vlan2 vlan3 和 vlan4 配置完毕后请同学们利用 PC0 ping PC1
  • 【pulsar学习】kafka存在的问题与pulsar应用场景

    文章目录 kafka存在的问题 pulsar的应用场景 kafka存在的问题 Kafka 很难进行扩展 因为 Kafka 把消息持久化在 broker 中 迁移主题分区时 需要把分区的数据完全复制到其他 broker 中 这个操作非常耗时
  • Flutter 通过命名路游跳转页面

    1 定义路由陆游 这里我们建一个存放路游的类 定义跳转页面使用 class Routers static String root splash static String login login static String work sor
  • 一文教你玩转Mybatis,超详细代码讲解与实战

    一 Mybatis 入门 1 1 什么是MyBatis MyBatis本是apache的一个开源项目iBatis 2010年这个项目由apache software foundation迁移到了google code 并且改名为MyBati
  • vue使用elementUI中日期选择器

    vue使用elementUI中日期选择器 需求 默认选中近一个月的 仅能选择今天到三年前的日期 今天以后的日期不可选
  • cisco: L2TP over ipsec的配置(1)

    用WINDOWS的L2TP客户端进行VPN连接时默认情况下是进行IPSEC加密的 当然通过更改注册表可以使L2TP不用IPSEC加密 不过在这里我们是要在CISCO路由器下进行L2TP OVER IPSEC的相关配置 使得用户可以在不更改注
  • 文件属性与目录

    目录 Linux 系统中的文件类型 7种 普通文件 目录文件 字符设备文件和块设备文件 符号链接文件 管道文件 套接字文件 stat 函数 struct stat 结构体 st mode 变量 struct timespec 结构体 练习
  • 有了这15款编程游戏,谁都可以学编程!

    1 Coding Games 一边玩游戏 一边挑战编程难题 Coding games支持包括PHP C JavaScript在内的20多种编程语言 用户界面功能强大 可以定制 例如 你可以选择你的代码编辑器的风格 Emacs Vim Cla
  • unity 2017.3 Tips 重置场景后变暗(丢失烘焙效果)

    Unity 2017 3重置游戏场景后场景变暗 这是重置场景的代码 其实就是重新载入本场景 SceneManager LoadScene int 原因 选择的光照模式是实时光照 编辑器在当前场景时 它的灯光是已经渲染好了 但重新加载的时候灯
  • 海量数据随机抽样问题(蓄水池问题)

    海量数据随机抽样问题 蓄水池问题 随机抽样问题表示如下 要求从N个元素中随机的抽取k个元素 其中N无法确定 这种应用的场景一般是数据流的情况下 由于数据只能被读取一次 而且数据量很大 并不能全部保存 因此数据量N是无法在抽样开始时确定的 但
  • 使用webpack5搭建vue3项目过程记录(详细注解)

    在开始搭建之前 首先理清楚webpack的五大核心概念 1 entry 入口 指示 Webpack 从哪个文件开始打包 2 output 输出 指示 Webpack 打包完的文件输出到哪里去 如何命名等 3 loader 加载器 webpa