从0到1构建一个vue3的脚手架,熟悉一下webpack的基础配置
项目结构搭建
// 生成package.json
npm init -y
// 生成ts配置文件
// 如果没有tsc 安装npm install typescript -g
tsc --init
并创建如下的文件目录结构
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
是启动开发服务器
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没有问题
引入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
}
安装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
文件,添加背景颜色
识别ts
pnpm add typescript
pnpm add ts-loader
现在我们每次打包之前需要手动删除dist文件夹,现在我们引入plugin自动清除dist文件夹
pnpm add clean-webpack-plugin
再次打包的时候,现在我们看到输出的东西是这么一坨,看着非常难受,我们来美化一下
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
现在内容就简洁了许多了
其他配置
配置devServer
devServer: {
proxy: {},
// 改变端口
port: 9001,
hot: true,
open: true,
},
将Vue通过cdn引入的模式,不将Vue打包到dist文件夹中
externals:{
vue:'Vue'
},
不使用cdn之前
使用cdn引入之后的大小,可以发现大大减小了
使用cdn之后,就不会把vue打包进去,可以通过script标签的方式引入,我们现在打开看效果肯定是不行的,会报vue
is not defined,我们去官网上找个cdn放入index.html
中
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
我们再打包一下,就可以正常显示了
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