第二章 工程化 - 基于 webpack 从零构建 vue3.x 项目基本流程

发布时间 2023-03-28 15:22:43作者: caix-1987

webpack 安装

1、webpack 的安装有两种方式

  1、全局安装 【 不推荐 】
  
  2、局部安装 【 推荐 】
全局安装
    1、安装 webpack v4+ 版本时,需要额外加安装 webpack-cli
    
      npm install webpack webpack-cli -g

    2、检查版本
    
      webpack -v

    3、卸载
    
      npm uninstall webpack webpack-cli -g
      
 说明
 
   1、webpack-cli 是执行 webpack 的工具
   
   2、webpack 4.x 版本以后,剥离出了 webpack-cli ,所以这里我们需要单独下载它
   
   3、全局安装 webpack ,这会将你项目中的 webpack 锁定到指定版本
   
   4、不同的项目中因为 webpack 依赖不同版本而导致冲突,构建失败
局部安装
    1、初始化 npm 配置文件
    
      npm init -y  
      
    2、安装核心库  
    
      npm install --save-dev webpack 
    
    3、安装命令行工具
    
      npm install --save-dev webpack-cli  

    4、安装最新到 4.x稳定版本
    
      npm i -D webpack@4.44.0

    5、 安装指定版本
    
      npm i -D wenpack@<version>
      
    6、yarn 安装
    
      yarn add webpack webpack-cli -D

基于 webpack 从零构建 vue3.x 项目 构建流程示例

第一步 基础流程 配置
1、新建项目文件夹 

2、在 文件下 执行

   npm init -y   【 -y 可以跳过提问 自动生成】
   
   此时 会生成一个 只有 package.json 文件的项目
   
3、安装 webpack 和 webpack-cli

   yarn add webpack webpack-cli -D
   
4、在 文件下 新建 src 文件夹

5、在 src 里 新建 main.js

6、在 文件夹 下 新建 index.html + webpack.config.js

7、添加 webpack.config.js 的相关基础配置项

   webpack.config.js 配置如下
   
   const path = require('path')

   module.exports = {
     mode: 'development',   // 环境模式
     entry: path.resolve(__dirname, './src/main.js'),   // 打包入口
     output: {
       path: path.resolve(__dirname, 'dist'),   // 打包出口
       filename: 'js/[name].js'   // 打包完的静态资源文件名
     }
   }

8、修改 package.json 的 script 属性

   "scripts": {
     "dev": "webpack --config ./webpack.config.js"
    }
    
 9、运行命令 yarn dev 成功 生成 dist 文件夹 打包成功   
基础 webpack.config.js 配置
const path = require('path')

module.exports = {
  mode: 'development', // 环境模式
  entry: path.resolve(__dirname, './src/main.js'), // 打包入口
  output: {
    path: path.resolve(__dirname, 'dist'), // 打包出口
    filename: 'js/[name].js' // 打包完的静态资源文件名
  }
}
第二步 添加 html-webpack-plugin 插件 并配置
1、html-webpack-plugin 的作用

  当使用 webpack 打包时,创建一个 html 文件,并把 webpack 打包后的静态文件自动插入到这个 html 文件当中
  
2、html-webpack-plugin 的安装

  yarn add html-webpack-plugin -D
  
3、html-webpack-plugin 在 webpack.config.js 下引入 并 配置 使用 【 示例 基础配置 】

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: 'index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
  plugins: [
   new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "./index.html"), // 要使用的 html 模板地址
      filename: "index.html", // 打包后输出的文件名
      title: "从零开始搭建 vue 开发环境", // index.html 模版内 通过 <%= htmlWebpackPlugin.options.title %> 拿到的变量
    }),
  ]
}

4、html-webpack-plugin 更多配置

   1、html-webpack-plugin 默认将会在 output.path 的目录下创建一个 index.html 文件, 并在这个文件中插入一个 script 标签,标签的 src 为 output.filename

   2、在实际的项目中,需要自定义一些 html-webpack-plugin 的配置, 像指定生成目录和文件, 使用指定模版生成文件, 更改 document.title 信息等, 这就更改默认配置来实现
第三步 引入 Vue 3.x 进行配置
1、安装 vue3.x

  yarn add vue@next -S

  1、这里要使用 vue@next 才能成功引入 Vue 3.x,否则就会引入 2.x 的最高版本
  
  2、这里 -S 是指生产环境需要用到的包 — dependencies
  
  3、同理 -D 表示开发环境需要的依赖
  
2、我们在 src 目录下新建 App.vue 组件

3、配置 main.js 文件 

   把 App.vue 挂载到 index.html 的 <div id="caix"></div> 节点上
  
    import { createApp } from 'vue'  // Vue 3.x 引入 vue 的形式
    import App from './App.vue'  // 引入 APP 页面组建

    const app = createApp(App)  // 通过 createApp 初始化 app
    app.mount('#caix')  // 将页面挂载到 root 节点
    
4、执行 yarn dev  报错

   1、需要适当的 loader 程序来处理 .vue 文件类型,当前没有配置任何 loader 来处理此文件
   
   2、必须让它变成浏览器认识的语言,那就是 js ,于是需要添加下面几个插件
  1、vue-loader

     它是基于 webpack 的一个的 loader 插件,解析和转换 .vue  文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,再分别把它们交给对应的 loader 去处理如 style-loader 、 less-loader 等,核心的作用就是 提取 

  2、@vue/compiler-sfc

     Vue 2.x 时代,需要 vue-template-compiler 插件处理 .vue 内容为 ast , Vue 3.x 则变成 @vue/compiler-sfc 
   
安装的时候注意 vue-loader 需要通过 yarn add vue-loader@next 安装最新版本。   
5、webpack.config.js 配置 VueLoaderPlugin

   1、VueLoaderPlugin 的职责是将你定义过的其它规则复制并应用到 .vue 文件里相应语言的块

   2、例如,如果你有一条匹配 /\.js$/ 的规则,那么它会应用到 .vue 文件里的 <script> 块

   3、代码示例如下

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 最新的 vue-loader 中,VueLoaderPlugin 插件的位置有所改变
const { VueLoaderPlugin } = require('vue-loader/dist/index')

module.exports = {
  mode: 'development',
  entry: path.resolve(__dirname, './src/main.js'),
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/[name].js'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: [
          'vue-loader'
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './index.html'),
      filename: 'index.html',
      title: '手搭 Vue 开发环境'
    }),
    // 添加 VueLoaderPlugin 插件
    new VueLoaderPlugin()
  ]
}
6、App.vue 文件 添加 样式

   <style>
     h1 {
      color: red;
     }
   </style>
   
   执行 yarn dev 报错
   
   少 loader 了,我们还需增加下面几个插件
   
     1、style-loader
   
       将 css 样式插入到页面的 style 标签中
      
     2、css-loader
     
       处理样式中的 url ,如 url('@/static/img.png') ,这时浏览器是无法识别 @ 符号的
       
 注意 vue-style-loader 是服务端渲染的时候,需要的 loader,包括 less-loader、sass-loader 都是在用到的时候,才去添加      
7、安装 style-loader  和  css-loader 并 配置

module: {
	rules: [
  	...
    {
      test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
    }
    ...
  ]
}
8、添加一个必备小插件 clean-webpack-plugin

  clean-webpack-plugin 插件的作用是每次打包的时候,都会把 dist 目录清空,防止文件变动后,还有残留一些老的文件,以及避免一些缓存问题
  
  webpack.config.js 配置如下
  
    const { CleanWebpackPlugin } = require('clean-webpack-plugin')
    plugins: [
      new CleanWebpackPlugin()
    ]
构建流程总结
基于 webpack 从零构建 vue3.x 项目

 1、新建项目文件夹,初始化 【 npm init 】生成 package.json 文件
 
 2、安装 webpack 和 webpack-cli
 
 3、建立项目相关文件 【 src 文件夹 index.html main.js】
 
 4、进行基础 webpack.config.js 配置
 
 5、添加 html-webpack-plugin 插件 并配置
 
 6、添加 vue3.x   yarn add vue@next -S
 
 7、建立 App.vue 文件 配置 main.js 并挂载 到根节点
 
 8、添加 vue-loader 、@vue/compiler-sfc 、style-loader 、css-loader 并配置
 
 9、添加 clean-webpack-plugin 插件
基于以上配置的 webpack.config.js 配置文件
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { VueLoaderPlugin } = require("vue-loader/dist/index"); // 最新的 vue-loader 中,VueLoaderPlugin 插件的位置有所改变
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  mode: "development", // 环境模式
  entry: path.resolve(__dirname, "./src/main.js"), // 打包入口
  output: {
    path: path.resolve(__dirname, "dist"), // 打包出口
    filename: "js/[name].js", // 打包完的静态资源文件
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: ["vue-loader"],
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "./index.html"), // 要使用的 html 模板地址
      filename: "index.html", // 打包后输出的文件名
      title: "从零开始搭建 vue 开发环境", // index.html 模版内 通过 <%= htmlWebpackPlugin.options.title %> 拿到的变量
    }),

    new CleanWebpackPlugin(),
    new VueLoaderPlugin(), // 添加 VueLoaderPlugin 插件
  ],
};