webpack打包Vue项目【完整版】

news2024/11/18 8:16:02

文章目录

    • 前言
    • Vue 相关包:
    • 项目搭建
      • 1. 初始化项目
      • 2. 安装 Vue 和 Webpack
      • 3. 创建目录结构
      • 4. 创建文件项目
      • 5. 配置 Webpack
      • 6. 配置 Babel
      • 7. package.json
      • 8. 打包和运行

前言

基于 上一篇 webpack 的配置详解 ,我们已经知道了 webpack 在项目中的常用的配置和模块,这篇文章我们将使用 Webpack 来打包一个 Vue 项目,从实战出发,我们主要介绍一些 webpack 的特性在项目中怎么去使用,不会涉及太多 Vue 相关的知识及 Vue 项目的优化

本文分两部分来介绍:

第一部分:将先介绍 webpack 打包 Vue 需要用到的 Vue 相关包,然后配置项目目录及必要文件,最后配置 webpack.config.js,运行项目
第二部分:探索 cdn、分包、tree Shaking、已经热更新的使用`

Vue 相关包:

Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。它由核心库和一系列生态系统包组成,每个包都有其特定的功能。我只列举了本文需要用到包,不代表全部

  1. vue:

    • 功能: Vue 核心库,提供了响应式数据绑定和组件系统。
    • 用途: 用于创建应用程序的视图层。
  2. vue-template-compiler:

    • 功能: Vue 模板编译器,用于将 Vue 模板编译成渲染函数。
    • 用途: 在构建过程中使用,通常在运行时不需要。
  3. vue-loader:

    • 功能: webpack 加载器,用于处理 .vue 文件,将模板、脚本和样式分别处理并最终打包成一个 JavaScript 模块。
    • 用途: 在使用 webpack 构建 Vue 应用时使用。
  4. vue-router:

    • 功能: Vue 官方的路由管理器。
    • 用途: 用于构建单页面应用(SPA),管理应用的路由和视图。

项目搭建

1. 初始化项目

首先,你需要创建一个新的项目目录,并初始化一个 npm 项目:

mkdir webpack-vue2 && cd webpack-vue2
npm init -y

2. 安装 Vue 和 Webpack

接下来,安装 Vue 和 Webpack 相关的依赖:


pnpm i vue@2.6.10 webpack@4.47.0 webpack-cli@4.10.0 vue-router@3
pnpm i vue-loader vue-template-compiler@2.6.10 css-loader vue-style-loader -D
pnpm i babel-core babel-loader babel-preset-env html-webpack-plugin@4 webpack-dev-server@3 -D

3. 创建目录结构

├── dist
|  ├── bundle.js
|  └── index.html
├── package.json
├── pnpm-lock.yaml
├── src
|  ├── App.vue
|  ├── index.html
|  ├── main.js
|  ├── router.js
|  └── views
├── webpack.config.js
└── yarn.lock

4. 创建文件项目

src目录下创建一个main.js文件,作为项目的入口文件:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

new Vue({
  render: (h) => h(App),
  router,
}).$mount("#app");

src目录下创建一个router.js文件:

import Vue from "vue";
import VueRouter from "vue-router";
import Hello from "./views/Hello.vue";
import List from "./views/List.vue";

Vue.use(VueRouter);
const Foo = { template: "<div>foo</div>" };
const Bar = { template: "<div>bar</div>" };

const routes = [
  {
    path: "/",
    component: Hello,
  },
  {
    path: "/hello",
    component: Hello,
  },
  {
    path: "/list",
    component: List,
  },
];
const router = new VueRouter({
  mode: "hash",
  routes,
});

export default router;

src目录下创建一个App.vue文件:

<template>
  <div id="app">
    <h1>Hello App!</h1>
    <p>
      <router-link to="/hello">Hello 页面</router-link>
      <router-link to="/list">List 页面</router-link>
    </p>
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data() {
    return {}
  },
};
</script>

<style></style>

src/views目录下创建一个Hello.vue文件:

<template>
  <div>
    <input v-model="message" />
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  name:'Hello',
  data() {
    return {
      message: "Hello Vue!",
    };
  },
};
</script>


src/views目录下创建一个List.vue文件:

<template>
  <div>
    <h3>前端三大框架:</h3>
    <ul>
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name:'List',
  data() {
    return {
      list: ["Vue", "React", "Angular"],
    };
  },
};
</script>



src目录下创建一个index.html文件,作为项目的入口文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title> <%=  htmlWebpackPlugin.options.title %></title>
</head>
<body>
  <div id="app"></div>
</body>
</html>

5. 配置 Webpack

在项目根目录下创建一个webpack.config.js文件,配置 Webpack:

const path = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: "vue-loader",
      },
      {
        test: /\.css$/,
        use: ["vue-style-loader", "css-loader"],
      },
      {
        test: /\.js$/,
        use: {
          loader: "babel-loader",
        },
      },
    ],
  },
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "src"),
      vue$: "vue/dist/vue.esm.js", // 确保使用vue的ES模块
    },
    extensions: ["*", ".js", ".vue", ".json"],
  },
  devServer: {
    contentBase: "dist",
    host: "localhost",
    port: "8088",
    open: true,
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebpackPlugin({
      title: "vuew + webpack",
      template: "./src/index.html",
    }),
  ],
};

6. 配置 Babel

创建一个.babelrc文件来配置 Babel:

{
  "presets": [
    [
      "env",
      {
        "targets": {
          "node": "current" // 根据当前节点版本进行编译
        }
      }
    ]
  ]
}

7. package.json

{
  "scripts": {
    "serve": "webpack-dev-server",
    "build": "webpack"
  },
  "dependencies": {
    "vue": "2.6.10",
    "vue-router": "3"
  },
  "devDependencies": {
    "@babel/core": "^7.9.0",
    "babel-loader": "^8.1.0",
    "babel-preset-env": "^1.7.0",
    "css-loader": "^3.4.2",
    "html-webpack-plugin": "4",
    "vue-loader": "^15.9.3",
    "vue-style-loader": "^4.1.2",
    "vue-template-compiler": "2.6.10",
    "webpack": "^4.42.1",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.10.3"
  }
}

8. 打包和运行

pnpm serve // 运行
pnpm build // 打包

在这里插入图片描述

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

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

相关文章

IP地址与智能家居能够碰撞出什么样的火花呢?

感应灯、远程遥控空调&#xff0c;自动感应窗帘——智能家居已经在正逐步走入我们的生活&#xff0c;为我们带来前所未有的便捷与舒适体验。而在这一进程中&#xff0c;IP地址又能够与智能家居碰撞出什么样的火花呢&#xff1f; 一、IP地址&#xff1a;智能家居的连接基石 智…

SOLIDWORKS 2025新版本揭秘 | 设计、协作和数据管理篇

除非另有说明&#xff0c;否则所有增强功能均适用于 3DEXPERIENCE SOLIDWORKS 和 SOLIDWORKS Cloud Services。 1&#xff5c;更髙效的协作和数据管理 直接从 SOLIDWORKS 访问社区&#xff0c;轻松与业界同行建立联系并开展协作。 利用实时通知时刻关注蕞新动态&#xff0c;…

基于Hive和Hadoop的图书分析系统

本项目是一个基于大数据技术的图书分析系统&#xff0c;旨在为用户提供全面的图书信息和深入的图书销售及阅读行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以…

腾讯云SDK产品功能

本文主要介绍音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的核心功能。 直播推流 音视频终端 SDK&#xff08;腾讯云视立方&#xff09;为终端直播场景提供强大的 RTMP、RTC 推流能力&#xff0c;配合云直播&#xff08;CSS&#xff09;全球布局的2000节点&#xff0…

山丹县综能智慧新能源:“智能二维码”,推动班组管理信息化

近日&#xff0c;为了提升管理效率&#xff0c;国电投建业光伏电站将二维码引入设备巡视和班组建设中。 首先&#xff0c;使用传统纸质巡视作业卡&#xff0c;巡视工作强度大&#xff0c;容易出现错误&#xff1b;此外&#xff0c;“三会一活动”和培训记录等班组建设过程材料…

DCDC电源PCB设计

环路 高频电流环路面积越小越好&#xff1a; 电感所在的支路不属于高频电流环路 对于BUCK电路&#xff0c;电容Ci的越靠近芯片Vi引脚越好&#xff0c;D1越靠近SW引脚越好&#xff0c;同时另一端越靠近芯片GND引脚越好&#xff1a; 示例&#xff1a; 然后是布局输出&#…

一次性使用唾液采集器:唾液样本常温收集保存及运输的较佳选择工具!

一次性使用唾液采集器确实是进行唾液样本常温收集、保存及运输的较佳选择工具之一&#xff0c;尤其适用于需要非侵入性、便捷且成本效益高的样本采集场景&#xff0c;如基因检测、药物监测、疾病筛查等领域。以下是其作为较佳选择的几个主要原因&#xff1a; 非侵入性采集&…

Linux安装tomcat及配置环境变量超详细教程

微服务Linux解析部署使用全流程 linux系统的常用命令 Linux安装vim超详细教程 Linux安装JDK及配置环境变量超详细教程 1、上传压缩包 统一创建目录&#xff1a;/usr/local/tomcat&#xff0c;将压缩包上传到这个目录下。拖动文件到这个目录下即可。 2、执行解压命令 先进…

ESP01S连接新版OneNET物联网平台

ESP01S连接OneNET ESP01S模块连接新板OneNET物联网平台OneNET创建产品创建设备创建物模型 ESP01S1、烧录MQTT固件2、发送AT指令连接到OneNET1、AT2、ATCWMODE13、ATCWDHCP1,14、ATCWJAP"WIFI名称","WIFI密码"5、ATMQTTUSERCFG0,1,"设备名称",&qu…

18.Linux-配置DNF仓库

DNF仓库产生背景 在现实的场景中&#xff0c;我们经常要安装一些软件包&#xff0c;但由于现场不提供网络。 需要使用光盘或文件下载的方式去安装。 对于linux有两种离线安装方式&#xff1a;二进制文件安装和源码安装 其中二进制文件是比较简单的安装方式&#xff0c;不同的l…

【IAPP源码】仿奇异社区UI

【IAPP源码】仿奇异社区UI 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89801612 更多资源下载&#xff1a;关注我。

【Linux网络】详解TCP协议(2)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux网络 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 TCP协议的三次握手和四次挥手 的相关内容。 如果看到最后您觉得…

AT89C51单片机和STC单片机烧录不同引脚问题

首先确定一下&#xff0c;两种烧录接口引脚不同 STC烧录器主要使用串口引脚 实际上stm32中也可以使用这种UART通信方式烧录程序&#xff0c;只是需要确定连接引脚进入bootloader模式 AT89C51来源Atmel公司&#xff0c;其中AVR单片机也是这个公司 ISP和SPI不是一个概念&…

C++不同的头文件中各种函数的操作使用(长期更新,找到新的就补充进来)

一、万能头文件 #include <bits/stdc.h> 万能头文件中包含的内容 // C #ifndef _GLIBCXX_NO_ASSERT #include <cassert> #endif #include <cctype> #include <cerrno> #include <cfloat> #include <ciso646> #include <climits> #in…

智慧城市交通管理中的云端多车调度与控制

城市交通管理中的云端多车调度与控制 智慧城市是 21世纪的城市基本发展方向&#xff0c;为了实现智慧城市建设的目标&#xff0c;人们需要用现代化的手段去管理和控制城市中的各种资源和设施。智能交通控制与管理是智慧城市中不可缺少的一部分&#xff0c;因为现代城市交通系统…

优化|基于深度学习的不动点算子优化的热启动方法

原文信息&#xff08;包括题目、发表期刊、原文链接等&#xff09;&#xff1a;Learning to Warm-Start Fixed-Point Optimization Algorithms 原文作者&#xff1a;Rajiv Sambharya, Georgina Hall, Brandon Amos, and Bartolomeo Stellato 论文解读者&#xff1a;陈宇文 编…

C++模版类实现栈

text.h #ifndef TEXT_H #define TEXT_H#include <stdexcept> // 用于 std::out_of_rangetemplate <typename T> class MyStack { private:T* data; // 指向底层数组的指针int capacity; // 容量int top; // 栈顶索引int size; // 当前元…

了解Webpack并处理样式文件

目录 引入定义安装和使用配置文件命令配置单独文件指定文件 处理样式css-loader使用 style-loaderless-loaderPostCSSpostcss-loaderpostcss-preset-env 引入 随着前端的快速发展&#xff0c;目前前端的开发已经变的越来越复杂了&#xff1a; 比如开发过程中我们需要通过模块化…

物联网系统中高精度压力检测方案_压力变送器

01 物联网系统中为什么要使用压力变送器 在物联网系统中使用压力变送器的原因主要基于以下几个方面&#xff1a; 感知层的核心作用 物联网系统主要由感知层、传输层、平台层和应用层组成。感知层作为物联网的“排头兵”&#xff0c;负责收集物理世界中的各种信息。压力变送…

十大排序算法总结

完整文档见 排序算法总结——语雀文档 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非比较类排序&#xff1a;不通过比较来决定元素间的相对次序&#xff0c;它可以突破…