vue3+webpack项目搭建实验
时间:2022-07-23
本文章向大家介绍vue3+webpack项目搭建实验,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文件目录
├── build
| ├── webpack.base.js
| ├── webpack.dev.js
| └── webpack.prod.js
├── package.json
├── postcss.config.js
├── public
| └── index.html
├── README.md
├── src
| ├── App.vue
| ├── components
| | └── MyButton.vue
| └── main.js
└── yarn.lock
依赖安装
自我习惯使用
yarn
, 可以通过npm install -g yarn
来安装
1. 初始化项目
mkdir vue3Test
cd vue3Test
yarn init -y
2. 安装依赖
a. 安装 vue3
yarn add vue@next
b. 安装webpack相关
yarn add webpack webpack-cli webpack-dev-server webpack-merge --dev
c. 安装webpack插件
yarn add html-webpack-plugin clean-webpack-plugin terser-webpack-plugin optimize-css-assets-webpack-plugin --dev
-
html-webpack-plugin
处理静态文件 -
clean-webpack-plugin
打包时自动删除之前打包文件 -
terser-webpack-plugin
JS压缩插件 -
optimize-css-assets-webpack-plugin
CSS压缩插件
d. 安装webpack加载器
yarn add file-loader image-webpack-loader style-loader css-loader sass-loader sass fibers vue-loader @vue/compiler-sfc postcss-loader autoprefixer cssnano --dev
-
file-loader
,image-webpack-loader
图片文件加载 -
style-loader
,css-loader
,sass-loader
,sass
,fibers
CSS加载(此处使用sass预处理) -
vue-loader
,@vue/compiler-sfc
Vue加载 -
postcss-loader
,autoprefixer
,cssnano
postcss加载
配置postcss
在 postcss.config.js
中配置
autoprefixer
用于给css加前缀, cssnano
用于压缩优化css
module.exports = {
plugins: [
require('autoprefixer'),
require('cssnano')({
preset: 'default'
})
]
}
配置webpack
从目录可以看到, 将webpack文件分为三个, webpack.base.js
用于通用配置, webpack.dev.js
用于配置开发模式, webpack.prod.js
用于配置生产模式, 开发模式和生产模式的配置文件通过之前安装的webpack-merge
来将通用配置合并进来
1.通用配置
webpack.base.js
通用配置, 主要是对基本的图片文件和CSS的加载配置
const webpack = require('webpack')
const path = require('path')
const sass = require('sass')
const Fiber = require('fibers')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
entry: './src/main.js',
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'dist')
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html'
}),
new VueLoaderPlugin(),
new webpack.HashedModuleIdsPlugin()
],
module: {
rules: [
{
test: /.vue$/,
use: 'vue-loader'
}, {
test: /.(png|svg|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
limit: 5000,
name: 'imgs/[hash].[ext]'
}
}
]
}, {
test: /.css$/,
use: ['style-loader', 'css-loader']
}, {
test: /.(scss|sass)$/,
use: [
'style-loader',
'css-loader',
{
loader: 'sass-loader',
options: {
implementation: sass,
sassOptions: {
fiber: Fiber,
}
}
},
'postcss-loader'
]
}
]
}
}
2. 开发模式配置
webpack.dev.js
开发模式主要是对webpack-dev-server
进行配置, 开发服务的端口, 代理配置等
const path = require('path')
const merge = require('webpack-merge')
const common = require('./webpack.base.js')
module.exports = merge(common, {
devtool: 'inline-source-map',
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: true,
port: 8090,
hot: true
},
output: {
filename: 'js/[name].[hash].js',
path: path.resolve(__dirname, '../dist')
},
module: {},
mode: 'development'
})
3. 生产模式
webpack.prod.js
生产模式, 主要是对JS, CSS进行压缩, 对文件进行分片
const path = require('path')
const merge = require('webpack-merge')
const common = require('./webpack.base')
const {
CleanWebpackPlugin
} = require('clean-webpack-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const OptimizeCssAssertsPlugin = require('optimize-css-assets-webpack-plugin')
module.exports = merge(common, {
mode: 'production',
output: {
filename: 'js/[name].[contenthash].js',
path: path.resolve(__dirname, '../dist')
},
plugins: [
new CleanWebpackPlugin()
],
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
name: 'vendor',
test: /[\/]node_modules[\/]/,
priority: 10,
chunks: 'initial'
}
}
},
minimizer: [
new OptimizeCssAssertsPlugin({}),
new TerserPlugin({
test: /.js(?.*)?$/i,
cache: true,
parallel: true,
sourceMap: false,
terserOptions: {
wranings: false,
output: {
comments: false
}
}
})
],
},
module: {
rules: [{
test: /.(gif|png|jpe?g|svg)$/i,
use: [
'file-loader',
{
loader: 'image-webpack-loader',
options: {
mozjpeg: {
progressive: true,
quality: 65
},
// optipng.enabled: false will disable optipng
optipng: {
enabled: false,
},
pngquant: {
quality: '65-90',
speed: 4
},
gifsicle: {
interlaced: false,
},
// the webp option will enable WEBP
webp: {
quality: 75
}
}
},
],
}]
}
})
代码测试
https://klren0312.github.io/vue3-webpack/
App.vue
<template>
<div class="container">
hello {{state.message}}
<div>数字: {{count}}</div>
<div>两倍数字: {{doubleCount}}</div>
<my-button name="增加" @get="increment"></my-button>
</div>
</template>
<script>
import { computed, ref, reactive } from 'vue'
import MyButton from './components/MyButton.vue'
export default {
components: {
MyButton
},
setup () {
const count = ref(0)
const state = reactive({
message: 'Vue3'
})
const doubleCount = computed(() => count.value * 2)
const increment = e => {
console.log(e)
count.value += 10
state.message = 'Vue3. Good!'
}
return {
count,
state,
doubleCount,
increment
}
}
}
</script>
<style lang="scss">
body {
font-size: 16px;
}
.container {
text-align: center;
line-height: 2;
}
</style>
参考资料
https://github.com/vuejs/vue-next https://webpack.js.org/concepts/
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java垃圾回收相关面试题
- Android中backgroundDimEnabled的作用
- 甲基化相关的习题背景补充
- Android 完全退出的实例详解
- Android 双击Back键退出应用的实现方法
- 2020最全Java面试题--基础篇
- Android开发之背景动画简单实现方法
- 15.深入k8s:Event事件处理及其源码分析
- 说一说 HashMap 底层数据结构
- 详解Android Service 使用时的注意事项
- Android自定义View实现QQ运动积分转盘抽奖功能
- 请简述Spring JDBC是如何进行配置的
- Java高频面试题 -- 静态
- 2020Java核心面试题--基础题
- 一日一技:在网页上如何获取鼠标当前指向的元素