webpack从0到1构建Vue3

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: webpack从0到1构建Vue3

从0到1构建一个vue3的脚手架,熟悉一下webpack的基础配置


项目结构搭建



// 生成package.json
npm init -y
// 生成ts配置文件
// 如果没有tsc 安装npm install typescript -g
tsc --init

并创建如下的文件目录结构

image.png


webpack相关配置安装



基本配置


我这里统一使用了pnpm进行安装,也可用npm, yarn...

安装webpack和webpack-cli


pnpm add webpack
pnpm add webpack-cli

启动服务webpack-dev-server


pnpm add webpack-dev-server

安装解析html插件


pnpm add html-webpack-plugin

webpack.config.js是基于node环境的,node是采用commonJs模块的

添加两条指令

build是进行打包的命令dev 是启动开发服务器

image.png

main.ts里面编写


const a = 1

编写webpack.config.js


// 引入这个,编写config文件可以有提示
const {Configuration} = require('webpack')
const path = require("path");
const htmlWebpackPlugin = require('html-webpack-plugin')
const config = {
    // 开发模式
    mode:"development",
    // 入口文件
    entry:'./src/main.ts',
    // 配置loader
    module:{
        rules:[
        ]
    },
    // 输出的文件位置
    output: {
        filename:'[hash].js',
        path:path.resolve(__dirname,'dist')
    },
    // plugin
    plugins:[
        new htmlWebpackPlugin({
            template:'./public/index.html'
        }),
    ],
}
// 记得导出config
module.exports = config

npm run build,查看打包结果,打包出来的dist没有问题

image.png


引入Vue


初始化App.vue


<template>
  <div>webpack搭建vue的脚手架</div>
</template>
<script setup></script>
<style lang="scss" scoped></style>

index.html中创建挂载节点


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack demo</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
    // 创建app节点
    <div id="app"></div>
</body>
</html>

安装引入vue


pnpm install vue

main.ts里面引入vue


import {createApp} from "vue";
import App from './App.vue'
const app = createApp(App)
// 挂载到id=app的节点上面
app.mount('#app')

注意:ts是不认识.vue结尾的文件的,所以我们要弄一个声明文件 在src下新建一个env.d.ts文件,并配置vue


// env.d.ts
declare module "*.vue" {
   import { DefineComponent } from "vue"
   const component: DefineComponent<{}, {}, any>
   export default component
}

image.png


安装vue-loader,解析vue和vue文件


pnpm add vue-loader@next
pnpm add @vue/compiler-sfc

使用插件,每次打包完自动删除


pnpm add clean-webpack-plugin

处理css相关样式


pnpm add css-loader
pnpm add style-loader
pnpm add less-loader

在assets文件夹下新建index.css文件,添加背景颜色image.png


识别ts


pnpm add typescript
pnpm add ts-loader

现在我们每次打包之前需要手动删除dist文件夹,现在我们引入plugin自动清除dist文件夹


pnpm add clean-webpack-plugin

再次打包的时候,现在我们看到输出的东西是这么一坨,看着非常难受,我们来美化一下

image.png


pnpm add friendly-errors-webpack-plugin

还可以添加路径别名,让@指向src目录

现在的webpack.config.js


// 引入这个,编写config文件可以有提示
const {Configuration} = require('webpack')
const path = require("path");
const htmlWebpackPlugin = require('html-webpack-plugin')
// 引入vue的plugin
const { VueLoaderPlugin } = require('vue-loader/dist/index');
// 清空dist
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
// 美化webpack输出
const FriendlyErrorsWebpackPlugin = require("friendly-errors-webpack-plugin");
const config = {
    // 开发模式
    mode:"development",
    // 入口文件
    entry:'./src/main.ts',
    module:{
        rules:[
            {
                test:/\.vue$/,
                use:'vue-loader'
            },
            {
                test: /\.less$/, //解析 less
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.css$/, //解析css
                use: ["style-loader", "css-loader"],
            },
            {
                test: /\.ts$/,  //解析ts
                loader: "ts-loader",
                options: {
                    configFile: path.resolve(process.cwd(), 'tsconfig.json'),
                    appendTsSuffixTo: [/\.vue$/]
                },
            },
        ]
    },
    // 输出的文件位置
    output: {
        filename:'[hash].js',
        path:path.resolve(__dirname,'dist')
    },
    // 配置别名
    resolve: {
        alias:{
            '@':path.resolve(__dirname,'src')
        },
        // 自动补全后缀
        extensions:['.vue','.ts','.js']
    },
    // plugin
    plugins:[
        new htmlWebpackPlugin({
            template:'./public/index.html'
        }),
        // 注册vue的plugin
        new VueLoaderPlugin(),
        // 注册清除dist的plugin
        new CleanWebpackPlugin(),
        //美化webpack
        new FriendlyErrorsWebpackPlugin({
            compilationSuccessInfo:{ //美化样式
                messages:['You application is running here http://localhost:9001']
            }
        }),
    ],
}
// 记得导出config
module.exports = config

现在内容就简洁了许多了

image.png


其他配置


配置devServer


devServer: {
        proxy: {},
        // 改变端口
        port: 9001,
        hot: true,
        open: true,
    },

将Vue通过cdn引入的模式,不将Vue打包到dist文件夹中


externals:{
    vue:'Vue'
},

不使用cdn之前

image.png

使用cdn引入之后的大小,可以发现大大减小了

image.png

使用cdn之后,就不会把vue打包进去,可以通过script标签的方式引入,我们现在打开看效果肯定是不行的,会报vueis not defined,我们去官网上找个cdn放入index.html


<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

image.png我们再打包一下,就可以正常显示了

cdn优势:减少体积,减少服务器请求压力 但是考验网速,有利有弊


webpack.config.js文件


// 引入这个,编写config文件可以有提示
const {Configuration} = require('webpack')
const path = require("path");
const htmlWebpackPlugin = require('html-webpack-plugin')
// 引入vue的plugin
const { VueLoaderPlugin } = require('vue-loader/dist/index');
// 清空dist
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
// 美化webpack输出
const FriendlyErrorsWebpackPlugin = require("friendly-errors-webpack-plugin");
const config = {
    // 开发模式
    mode:"development",
    // 入口文件
    entry:'./src/main.ts',
    module:{
        rules:[
            {
                test:/\.vue$/,
                use:'vue-loader'
            },
            {
                test: /\.less$/, //解析 less
                use: ["style-loader", "css-loader", "less-loader"],
            },
            {
                test: /\.css$/, //解析css
                use: ["style-loader", "css-loader"],
            },
            {
                test: /\.ts$/,  //解析ts
                loader: "ts-loader",
                options: {
                    configFile: path.resolve(process.cwd(), 'tsconfig.json'),
                    appendTsSuffixTo: [/\.vue$/]
                },
            },
        ]
    },
    // 输出的文件位置
    output: {
        filename:'[hash].js',
        path:path.resolve(__dirname,'dist')
    },
    // 配置别名
    resolve: {
        alias:{
            '@':path.resolve(__dirname,'src')
        },
        // 自动补全后缀
        extensions:['.vue','.ts','.js']
    },
    // plugin
    plugins:[
        new htmlWebpackPlugin({
            template:'./public/index.html'
        }),
        // 注册vue的plugin
        new VueLoaderPlugin(),
        // 注册清除dist的plugin
        new CleanWebpackPlugin(),
        //美化webpack
        new FriendlyErrorsWebpackPlugin({
            compilationSuccessInfo:{ //美化样式
                messages:['You application is running here http://localhost:9001']
            }
        }),
    ],
    externals:{
        vue:'Vue'
    },
    devServer: {
        proxy: {},
        // 改变端口
        port: 9001,
        hot: true,
        open: true,
    },
    stats:"errors-only", //取消提示
}
// 记得导出config
module.exports = config


参考


小满Vue3第四十三章(webpack 构建 Vue3项目)



相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
1月前
|
缓存 监控
webpack 提高构建速度的方式
【10月更文挑战第23天】需要根据项目的具体情况和需求,综合运用这些方法,不断进行优化和改进,以达到最佳的构建速度和效果。同时,随着项目的发展和变化,还需要持续关注和调整构建速度的相关措施,以适应不断变化的需求。
|
1月前
|
存储 缓存 前端开发
利用 Webpack 5 的持久化缓存来提高构建效率
【10月更文挑战第23天】利用 Webpack 5 的持久化缓存是提高构建效率的有效手段。通过合理的配置和管理,我们可以充分发挥缓存的优势,为项目的构建和开发带来更大的便利和效率提升。你可以根据项目的实际情况,结合以上步骤和方法,进一步优化和完善利用持久化缓存的策略,以达到最佳的构建效果。同时,不断探索和实践新的方法和技术,以适应不断变化的前端开发环境和需求。
|
6月前
|
缓存 JavaScript 前端开发
探讨如何通过一系列优化策略来提升TypeScript与Webpack的构建性能。
【6月更文挑战第11天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。通过这些方法,可以提升构建速度,提高开发效率。
79 0
|
4月前
|
前端开发 JavaScript C++
【绝技大公开】Webpack VS Rollup:一场前端工程化领域的巅峰对决,谁能笑到最后?——揭秘两大构建神器背后的秘密与奇迹!
【8月更文挑战第12天】随着前端技术的发展,模块化与自动化构建成为标准实践。Webpack与Rollup作为主流构建工具,各具特色。Webpack是一款全能型打包器,能处理多种静态资源,配置灵活,适合复杂项目;Rollup专注于ES6模块打包,利用Tree Shaking技术减少冗余,生成更精简的代码。Rollup构建速度快,配置简洁,而Webpack则拥有更丰富的插件生态系统。选择合适的工具需根据项目需求和个人偏好决定。两者都能有效提升前端工程化水平,助力高质量应用开发。
45 1
|
4月前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
50 0
|
6月前
|
缓存 前端开发 JavaScript
Webpack作为模块打包器,为前端项目提供了高度灵活和可配置的构建流程
【6月更文挑战第12天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。这些方法能提升构建速度,提高开发效率。
64 3
|
7月前
|
缓存 JavaScript 前端开发
【TypeScript技术专栏】TypeScript与Webpack构建优化
【4月更文挑战第30天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(关闭不必要的类型检查,适配目标环境)和webpack.config.js(配置entry、output、resolve,使用压缩插件)。启用Webpack缓存和增量构建,利用代码拆分与懒加载,能有效提升构建速度和开发效率。
89 0
|
7月前
|
缓存 前端开发 JavaScript
|
7月前
|
前端开发 JavaScript 开发者
webpack打包机制,构建过程和配置
webpack打包机制,构建过程和配置
49 0
|
7月前
|
JavaScript 应用服务中间件 nginx
nginx vue2+webpack 和 vue3+vite 配置二级目录访问
nginx vue2+webpack 和 vue3+vite 配置二级目录访问
387 0