使用webpack从0搭建Vue2项目脚手架

使用工具:Webpack@5 Vue@2

目录结构

首先要明确最终项目的目录结构

vue2webpackconfig
├── dist
│   ├── bundle.js
│   └── index.html
├── package-lock.json
├── package.json
├── src
│   ├── App.vue
│   ├── main.js
│   ├── pages
│   │   ├── About.vue
│   │   └── Home.vue
│   └── router
│       └── index.js
└── webpack.config.js

dist 目录:最终 webpack 打包后的目录;
src 目录:被打包的文件目录;
package.json 文件:包含了项目所有依赖的信息及配置;
package-lock.json 文件:锁定上传包的版本;
webpack.config.js 文件:webpack 配置文件。

目标

  • 配置 webpack 从 src 目录下的 main.js 文件打包至 dist 目录下生成的 bundle.js
  • 配置 vue 项目模板,能够成功编译运行;
  • 使用 vue-router 实现页面多组件跳转

第一步:准备工作

  • 建立 src 目录,dist 目录,在 src 目录下新建文件 main.js 为 webpack 打包入口文件;
  • dist 目录下新建文件 index.html 并且引入 bundle.js(打包出口,配置后自动生成)
//  index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    // vue 根实例绑定
    <div id="app"></div>
    <script src="bundle.js"></script>
</body>
</html>

第二步:安装项目依赖

  1. 安装项目依赖
npm i vue vue-router axios element-ui  
  1. 安装开发依赖
npm i -D webpack webpack-cli vue-loader vue-template-compiler sass sass-loader css-loader style-loader babel-loader @babel/core @babel/preset-env

webpack: 打包工具,使用的是 webpack5;
webpack-cli: 提供 webpack 终端命令去调用 webpack;
vue-loader: 将 vue 文件代码转换为 js;
vue-template-compiler: vue 模板编译器,将 template 内容转换为 HTML;
sass-loader、css-loader、style-loader: 将 sass => css => 处理 css => 通过 style 标签插入到 HTML;
babel-loader: 将 es6+ 语法转换为老语法,浏览器兼容;
@babel/core: babel 核心库;
@babel/preset-env: babel 预设配置集合;

第三步:配置文件

  1. 配置 webpack.config.js
const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')

module.exports = {
// 定义入口文件路径
    entry: './src/main.js',
// 定义出口文件路径,为绝对路径 __dirname 为当前目录,通过引入 path 模块拼接路径
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
    },
// 配置 loader
    module: {
        rules: [
            {
                test: /\.vue$/,
                use: 'vue-loader'
            },
            {
                test: /\.s[ca]ss$/,
                use: ['style-loader', 'css-loader', 'sass-loader']
            },
            {
                test: /\.m?js$/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
            {
                test: /\.(png|jpe?g|gif|svg|webp)$/,
//  webpack4 写法 use: {loader: 'file-loader', options: {esModule: false}}   
                type: 'asset/resource'
            }
        ]
    },
// 配置 plugin
    plugins: [
// 当遇到 vue 文件中的同类型文件时,使用同配置的 loader 进行转换
        new VueLoaderPlugin(),
    ]
}
  1. 配置入口文件 main.js
import Vue from 'vue';
import App from './App.vue'
import router from './router';

new Vue({
// 指定替换元素为 <div id='app' />
    el: '#app',
    router,
// vue 渲染函数,h 就是 createElement 创建 VNode 虚拟节点
    render: h => h(App)
})
  1. 配置 vue 单文件组件
<template>
  <div>
    <h1>我是 App.Vue !</h1>
  </div>
</template>

<script>
export default {};
</script>

<style lang="scss" scoped>
</style>

此时,我们已经基本配置完成,可以使用 webpack 运行预览了,但是还无法直接使用 webpack 命令,因为 webpack-cli 只是安装在了 ./node_modules/.bin/webpack 中,需要在 package.json 中添加配置脚本

  1. 配置 package.json
  "scripts": {
    // 创建开发服务器,设置为开发环境,--watch 实时编译打包
    "serve": "webpack --mode=development --watch",

    // 上线构建命令,设置为生产模式,打包一次,不需要 --watch
    "build": "webpack --mode=production"
  },
  1. 基础配置完成
npm run serve

到这里,vue2 项目脚手架基础配置完成。

第四步:配置路由

  1. 在 src 中创建一个 router 目录,在该目录下新建一个 index.js,创建一个 vue-router 实例并将其导出
// router/index.js
import VueRouter from 'vue-router'
import Home from '../pages/Home.vue'
import About from '../pages/About.vue'
import Vue from 'vue'

// 注册 VueRouter 至 Vue 实例
Vue.use(VueRouter)

const router = new VueRouter({
    routes: [
        {
            path: '/',
            component: Home
        },
        {
            path: '/about',
            component: About
        }
    ]
})

export default router
  1. src 下新建一个 pages 目录,可以在其中新建 Home 和 About 组件
  • Home 组件可跳转至 About 组件页面,使用 this.$router.push() 进行跳转
// Home.vue
<template>
  <div>
    我是首页
    <hr />
    <button @click="go">前往 About 页面</button>
  </div>
</template>

<script>
export default {
  methods: {
//  编程式导航
    go() {
      this.$router.push("about");
    },
  },
};
</script>

<style lang="scss" scoped>
</style>
  • About 组件可以跳转至 Home 组件页面,使用 <router-link to="" /> 实现跳转
// About.vue
<template>
  <div>
    我是关于页面
    <hr />
    <router-link to="/"> 前往 Home 页面 </router-link>
  </div>
</template>

<script>
export default {};
</script>

<style lang="scss" scoped>
</style>

最后:脚手架搭建完成

预览

可以使用 vscode 插件 live-server 启动一个服务器,进行预览


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容