在之前的文章中,我们已经了解了如何使用Vue CLI来创建Vue项目的开发环境。现在,大家已经可以轻松地运用Vue CLI来构建自己的Vue项目了。然而,你可能仍然对背后的工作原理感到困惑。接下来,我将引导你们在不使用Vue CLI的情况下,如何创建一个Vue项目环境。
我们将使用Webpack工具和它的一系列打包组件来编译和打包Vue模板文件及其相关的代码。我会详细介绍如何安装Webpack,以及它是如何打包Vue模块的,并且每个步骤都会进行详尽的解释。通过这个过程,你将能够深入理解Webpack在构建Vue项目过程中的所有细节,以及更深入地了解Webpack的相关配置知识
第一章 Vue3项目创建 1 Vue CLI 创建vue项目
第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目
第一章 Vue3项目创建 3 Vite 创建 vue项目
第二章 Vue3 基础语法指令
第三章 Vue Router路由器的使用
第四章 VUE常用 UI 库 1 ( element-plus,Ant ,naiveui,ArcoDesign)
第四章 VUE常用 UI 库 2 ( ailwind 后台框架)
1.2.1 单文件组件
Vue的Single File Component文件由模板、脚本、样式三部分组成,它的扩展名为vue。可以编写页HTML、CSS 和 JavaScript 代码到.vue模板文件三个对应标签中。
这种格式模板是 vue.js 独有的,而浏览器是无法直接运行.vue模板 文件的。所以必须通过Webpack工具将vue文件转换为浏览器能够理解的形式 html+JavaScript+css才能在浏览器中运行。
<template>
<div class="example">{{ msg }}</div>
</template>
<script>
export default {
data () {
return {
msg: 'Hello Vue Component'
}
}
}
</script>
<style scoped>
.example{
font-weight: bold;
}
</style>
1.2.2 创建vue项目
创建一个文件目录 webpack-vue 用于搭建vue项目。在进入 webpack-vue目录中使用 npm init -y 命令创建一个 package.json 文件。
$ mkdir webpack-vue
$ cd webpack-vue
$ npm init -y
命令行安装两个包:webpack 和 webpack-cli。
$ npm install --save-dev webpack webpack-cli
1.2.2.1 初始化 webpack
创建一个 src 文件夹并在其中创建一个 index.js 文件。
$ mkdir src
$ cd src
$ touch index.js
$ null>index.js //doc创建文件
创建文件index.js后整个webpack-vue文件夹目录内容。
webpack-vue
|---node_modules
|---src //代码源文件
| |--index.js //入口文件
|----package.json //配置文件
在webpack-vue目录下使用 npx webpack 命令运行 webpack 进程。执行命令完成后会出现WARNING,表示构建webpack过程完成,并在dist目录下创建main.js文件。
D:\vue\webpack-vue>npx webpack
asset main.js 0 bytes [emitted] [minimized] (name: main)
./src/index.js 1 bytes [built] [code generated]
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
webpack 5.74.0 compiled with 1 warning in 1064 ms
如果只运行 webpack 命令,会因为路径传递问题而报错。通过添加 npx,会自动从 node_modules/.bin/ 目录中搜索指定的命令并执行。
默认情况下,webpack 会自动找到 src/index.js 文件,构建它并在 dist 目录下创建一个 main.js 文件。
另外,执行命令时显示的WARNING提示是模式未设置的警告,我们可以通过设置模式选项的方法来消除这个警告。
$ npx webpack --mode development
asset main.js 1.18 KiB [emitted] (name: main)
./src/index.js 1 bytes [built] [code generated]
webpack 5.74.0 compiled successfully in 133 ms
$ npx webpack --mode production
模式参数
-
开发 development
-
生产 production
1.2.2.2 创建 webpack.config.js
每个webpack项目都要有一个webpack.config.js 配置文件,webpack 所有功能都是通过的配置文件中的参数来实现的。在 webpack-vue 文件夹下创建一个webpack.config.js 文件并在文件中设置webpack的模式。
module.exports = {
mode: 'development'
}
如果在 webpack.config.js 文件中设置了模式,就不需要使用 npx webpack --mode production 命令来设置模式了。
1.2.2.3 安装 vue.js
使用 npm 命令安装 vue.js到项目中。
$ npm i -S vue@next
added 19 packages in 4s
1.2.3 搭建 webpack 编译环境
webpack+vue项目的结构。
webpack-vue
|---node_modules
|---dist
| |--main.js //编译后运行js
|---index.html //运行html
|---src //代码源文件
| |--index.js //入口文件
| |--App.vue //模板代码
|----package.json //配置文件
|----webpack.config.js //编译脚本
1.2.3.1 创建初始页面
webpack工具默认加载文件是 src/index.js,我们在index.js编辑vue项目入口方法,将模板App挂载到页面
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
在src目录下创建一个App.vue模板文件。
<template>
<h1>Hello World</h1>
{{ message }}
</template>
<script>
export default {
name: 'App',
data() {
return {
message: "Hello Vue!"
}
}
}
</script>
<style>
</style>
webpack-vue目录下创建index.html页面,这个页面是整个项目的入口页面,我们编写的vue代码都会通过页面中
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Webpack Vue.js</title>
</head>
<body>
<div id="app">
</div>
<script src="./dist/main.js"></script>
</body>
</html>
script src=“编辑后的js文件” 引入的是webpack工具编辑后的执行文件。
- 编辑 index.js 入口脚本
- 创建 App.vue 模板
- 创建 index.html 浏览器入口页面
1.2.3.2 vue-loader设置
vue-loader 是官方支持 Vue 的 SFC 的加载器,专门用于 webpack 打包编辑 Vue SFC。vue-loader会分析vue文件中编写的template、script、style标签内容并将其转换成浏览器可以识别的js代码,这个插件是打包编辑必须用到的。
$ npm i -D vue-loader@next @vue/compiler-sfc
使用 SFC Vue打包编译
- vue-loader@next (加载 SFC)
- @vue/compiler-sfc(vue运行编译组件 vue-loader)
webpack.config.js 文件中设置 VueLoderPlugin 插件内容引入loader功能。
const {VueLoaderPlugin } = require("vue-loader")
module.exports = {
mode: 'development',
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
],
}
运行编译命令 npx webpack
$ npx webpack
asset main.js 537 KiB [emitted] (name: main)
runtime modules 891 bytes 4 modules
cacheable modules 439 KiB
modules by path ./src/ 2.05 KiB
./src/index.js 92 bytes [built] [code generated]
./src/App.vue 743 bytes [built] [code generated]
./src/App.vue?vue&type=template&id=7ba5bd90 197 bytes [built] [code generated]
./src/App.vue?vue&type=script&lang=js 252 bytes [built] [code generated]
+ 2 modules
modules by path ./node_modules/ 437 KiB
modules by path ./node_modules/@vue/ 436 KiB
./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js 60.8 KiB [built] [code generated]
./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js 310 KiB [built] [code generated]
+ 2 modules
./node_modules/vue/dist/vue.runtime.esm-bundler.js 611 bytes [built] [code generated]
./node_modules/vue-loader/dist/exportHelper.js 328 bytes [built] [code generated]
webpack 5.74.0 compiled successfully in 764 ms
在浏览器打开index.html页面,看到 Hello Vue 显示在Hello World出来 。
1.2.3.3 vue-style-loader设置
css 模板需要导入相关的 vue-style-loader 和 css-loader 加载器,在webpack 中才会打包编译.vue模板中的<style>
中的元素代码。
$ npm i -D css-loader vue-style-loader
- css-loader (css 格式)
- vue-style-loader (sytel 中css 与 js 格式)
安装 css-loader 后,您需要在 webpack.config.js 文件中添加一些配置。注意 vue-style-loader 和 css-loader 的顺序也很重要。它们是按排列顺序执行加载运行的。css-loader解析vue文件中样式,通过vue-style-loader将style标签中的CSS信息添加到中html。
const {VueLoaderPlugin } = require("vue-loader")
module.exports = {
mode: 'development',
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader',
]
}
]
},
plugins: [
new VueLoaderPlugin()
],
}
如果只设置了css-loader只会分析class信息,所以用webpack命令不会出错,但是如果只设置vue-style-loader,则不能分析class信息,会出现Loader的错误提示信息。
App.vue模板中加入css样式.example{} 在
引入这个样式。
<template>
<h1 class="example">Hello World</h1>
<h2>111111</h2>
{{ message }}
</template>
<script>
export default {
name: 'App',
data() {
return {
message: "Hello Vue!"
}
}
}
</script>
<style>
.example{
font-weight: bold;
color:red;
}
</style>
运行编译命令 npx webpack 后。在浏览中查看 index.html页面,字体变成红色。
1.2.3.4 Babel 设置
Babel 是一个转换编辑JS代码所需的加载器,它将javasrcipt原生函数通过webpack 进行编译打包。
$ npm i -D @babel/core @babel/preset-env babel-loader
- @babel/core(babel 主体)
- @babel/preset-env(自动指定执行环境和转译的预设)
- babel-loader(转译 JS)
安装完成后,将 Babel 设置添加到 webpack.config.js 文件中。
const {VueLoaderPlugin } = require("vue-loader")
module.exports = {
mode: 'development',
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader',
]
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
}
]
},
plugins: [
new VueLoaderPlugin()
],
}
App.vue文件中加入初始化函数内容。
<template>
<h1 class="example">Hello World</h1>
<h2>111111</h2>
{{ message }}
</template>
<script>
export default {
name: 'App',
data() {
return {
message: "Hello Vue!"
}
},
created() {
const webpack_babel = '来到我的世界';
alert(webpack_babel);
},
}
</script>
<style>
.example{
font-weight: bold;
color:red;
}
</style>
运行编译命令 npx webpack 后。运行浏览中弹出对话框。
1.2.4 web 服务编译环境
很多时候我们需要在web服务模式下进行开发代码,这时候我们需要导入webpack web服务器开发插件到项目中。
$ npm i -D webpack-dev-server
$ npm i -D html-webpack-plugin
webpack.config.js 文件中加入服务器配置信息内容,导入服务插件const HtmlWebpackPlugin = require(“html-webpack-plugin”)。
const path = require('path');
const {VueLoaderPlugin } = require("vue-loader");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
mode: 'development',
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader',
]
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
}
]
},
plugins: [
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template:path.join(__dirname, "./index.html"),
})
],
}
配置服务的启始信息内容template:path.join(__dirname, “./index.html”)。
启动服务编辑模式npx webpack serve --open
$ npx webpack serve --open --mode=development
<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:8080/
<i> [webpack-dev-server] On Your Network (IPv4): http://172.22.132.232:8080/
<i> [webpack-dev-server] Content not from webpack is served from 'D:\vue\webpack-vue\public' directory
<i> [webpack-dev-middleware] wait until bundle finished: /
asset main.js 800 KiB [emitted] (name: main)
为了方便开发都会将web启动模式脚本加载package.json文件中。
{
......
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack serve --open --mode=development",
"build": "webpack --mode=production --progress",
"dist-clean": "rm -fr dist/*"
},
......
}
通过npm run start 命令启动web编辑模式,这样在开发的时候会很方便。
$ npm run start
> webpack-vue@1.0.0 start
> webpack serve --open --mode=development
<i> [webpack-dev-server] Project is running at:
<i> [webpack-dev-server] Loopback: http://localhost:8080/
<i> [webpack-dev-server] On Your Network (IPv4): http://172.22.132.232:8080/
<i> [webpack-dev-server] Content not from webpack is served from 'D:\vue\webpack-vue\public' directory
<i> [webpack-dev-middleware] wait until bundle finished: /
asset main.js 800 KiB [emitted] (name: main)
asset index.html 237 bytes [emitted]
runtime modules 27.3 KiB 12 modules
modules by path ./node_modules/ 606 KiB 32 modules
modules by path ./src/ 4.68 KiB
./src/index.js 91 bytes [built] [code generated]
./src/App.vue 807 bytes [built] [code generated]
./src/App.vue?vue&type=template&id=7ba5bd90 260 bytes [built] [code generated]
./src/App.vue?vue&type=script&lang=js 378 bytes [built] [code generated]
./src/App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css 272 bytes [built] [code generated]
./node_modules/babel-loader/lib/index.js??clonedRuleSet-2.use!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[1].rules[5].use[0]!./src/App.vue?vue&type=template&id=7ba5bd90 697 bytes [built] [code generated]
在浏览器录入http://localhost:8080 可以看到.vue脚本编辑的页面。