基于webpack从零构建vue2

275 阅读3分钟

相比于框架自带的脚手架如 vue-cli 构建项目,通过 webpack 构建更加灵活,但是也容易出错;对于从零搭建项目是一种很好的学习方式。

说在前面

项目搭建不会搭建的非常全,不会涉及 ui 库,网络请求等,以项目主体和通过工具优化为主;

环境准备

搭建步骤

1. 执行 npm init -y

2. 安装依赖

  • vue 和 vue-template-compiler 必须是一样的
  • vue-router v3 与 v4 在写法上有不同,这里用的是 v3
  • 在 webpack5 中安装 less-loader 需要安装 cache-loader

npm i -D webpack@5.74.0 webpack-cli@4.10.0 webpack-dev-server@4.10.0
npm i -D html-webpack-plugin@5.5.0

npm i vue@2.6.11

npm i -D vue-loader@15.10.0 vue-template-compiler@2.6.11
npm i -D babel-loader@8.2.5 @babel/core@7.18.13
npm i -D @babel/preset-env@7.18.10 @babel/polyfill@7.12.1
npm i -D @babel/plugin-transform-runtime@7.18.10
npm i -S @babel/runtime@7.18.9 @babel/runtime-corejs2@7.18.9
npm i -D style-loader@3.3.1 css-loader@6.7.1
npm i less-loader@11.0.0 less@4.1.3 -D
npm i cache-loader -D
npm i url-loader@4.1.1 file-loader@6.2.0 -D

npm i loadsh
npm i vue-router@3.6.5

3. 建立如下文件夹

4. public/index.html

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

5. .babelrc

  • babel 相关的依赖是用来处理 js 转换问题
{
  "presets": ["@babel/preset-env"],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "corejs": 2,
        "helpers": true,
        "regenerator": true,
        "useESModules": false
      }
    ]
  ]
}

6. package.json

  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack --mode development"
  },

7. router/index.js

const routes = [
  { path: '/', component: HomeView },
  { path: '/page', component: PageView },
]

const router = new VueRouter({
  routes,
})
export default router

8. webpack.config.js

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

module.exports = {
  mode: "development",
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "main.js",
  },
  watch: true,
  module: {
    rules: [
      { test: /.js$/, exclude: /node_modules/, loader: "babel-loader" },
      {
        test: /.vue$/,
        loader: "vue-loader",
      },
      { test: /.css$/, use: ["style-loader", "css-loader"] },
      {
        test: /.less$/,
        use: ["style-loader", "cache-loader", "css-loader", "less-loader","cache-loader"],
      },
      {
        test: /.(jpg|png|gif|bmp|jpeg|svg)$/,
        use: "url-loader?esModule=false&limit=500&name=imgs/[hash:8]-[name].[ext]",
      },
      {
        test: /.(woff|woff2|eot|ttf|otf)$/i,
        loader: "file-loader",
        options: {
          esModule: false,
        },
      },
    ],
  },
  plugins: [
    new VueLoaderPlugin(),
    new HtmlWebpackPlugin({ template: "./public/index.html" }),
  ],
  resolve: {
    extensions: [".js", ".css", ".vue"],
  },
  devServer: {
    port: 8080,
    hot: true,
    open: true,
    static: {
      directory: path.join(__dirname, "./"),
      watch: true,
    },
  },
};

9. main.js

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

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

依赖详解

packags.json 中有非常多的依赖,这里会去阐述每个依赖的作用

webpack 相关

webpack

  • webpack 是一个打包工具,将 ts、less、sass、vue 等资源转换成 html、css、js
  • 提供各种模块化,commonjs、esmodule、AMD 等等

webpack-cli

  • webpack-cli 的Webpack 的命令行接口,执行 npm run build 本质上执行的是 webpack ,webpack-cli 就是让允许终端执行 webpack 命令

webpack-dev-server

  • webpack-dev-server 用于项目的热更新,以免每次都要打包再刷新页面

vue 相关

vue

  • vuejs 的核心库,用来提供响应式更新,组件化开发,指令等功能

vue-loader

  • 用来处理 .vue 单文件,将 vue 文件中的 template,style,css 交给不同的工具(vue-template-complier 处理 tempalte 模块;babel-loader 处理 script 模块;less/less-load 而处理 style 模块)去处理,最终形成一个 js 模块
  • 支持热更新

vue-template-complier

  • 将 vue 文件中的 template 编译成 render 函数,vue-loader 依赖 vue-tempalte-complier 处理 template 部分

babel 相关

@babel/core

  • babel 是一个广泛使用的 JavaScript 编译器,能够将现代 JavaScript 代码(如 ES6+ 语法、JSX 等)转换为向后兼容的版本,@babel/core 是 babel 的核心库,提供了编译 JavaScript 代码所需的所有基本功能

babel-loader

  • 配合 babel 编译 .vue .ts 成 js 文件

@babel/preset-env

  • @babel/preset-env 会根据你指定的目标环境(如浏览器版本、Node.js 版本等)自动选择需要的 Babel 插件。这意味着你不需要手动添加或管理每个单独的插件,只需配置目标环境,@babel/preset-env 会为你处理其余的事情
  • @babel/preset-env 可以将 ES6 模块(ESM)转换为其他模块格式(如 CommonJS、AMD、UMD 等),以便在不支持 ESM 的环境中使用

@babel/polyfill

  • @babel/polyfill 会在编译时自动将必要的 polyfills 引入到你的项目中,从而确保代码的兼容性

@babel/plugin-transform-runtime

  • 一个插件,可以重用 Babel 注入的帮助程序代码以节省代码量

样式相关

less-loader 处理样式文件,将 less 转成 css

url-loader/file-loader

将文件转成 base64 或者转成 http 链接

总结

相比于 vue-cli 直接生成,webpack 搭建可以学习到 webpack 的构建方式,vue 文件如何被处理,babel 方面的知识。下一篇会基于该项目进行 webpack 优化