手动搭建VUE开发环境

2023-05-16

1、搭建webpack基础环境

1.1初始化项目

npm init

此时会生成一个webpack.json文件,主要是生成项目的基础信息

1.2安装webpack及手脚架

npm install webpack webpack-cli -D

-D命令要使用大写,否则识别不出来,会默认安装到生产环境中

2、开始配置功能

2.1配置ES6/7/8转ES5代码

npm install babel-loader @babel/core @babel/preset-env -D
  • 新建一个build文件夹,用来存放webpack相关的文件
  • 在build文件夹内新建一个webpack.config.js文件,配置webpack的基本配置
//webpack.config.js
const path = require('path')

module.exports = {
    //指定打包模式
    mode: 'development',
    entry: {
        //配置入口文件
       main: path.resolve(__dirname, '../src/main.js')
    },
    output: {
        //配置打包文件输出的目录
        path: path.resolve(__dirname, '../dist'),
        //生成的js文件名称
        filename: 'js/[name].[hash:8].js',
        //生成的chunk名称
        chunkFilename: 'js/[name].[hash:8].js',
        //资源引用路径
        publicPath: './'
    },
    module: {
        rules: [
            {   //将js或者jsx文件转码成es5
                test: /\.jsx?$/,    // 正则惰性匹配后缀名为js或者jsx的文件
                exclude: /node_modules/,    //排除node_modules文件夹
                loader: 'babel-loader',
                options: {
                    presets:['@babel/preset-env']
                }
            }
        ]
    }
}

新建src文件夹,在文件夹内创建一个main.js文件

//main.js
let name = "xiaoming";
console.log("hello" + name);

然后在package.json加入以下代码

 "build": "webpack --config ./build/webpack.config.js"

执行以下命令会打包成一个dist文件,而且下面有一个由src/main.js打包出来的main.js文件

npm run build

2.2使用 html-webpack-plugin来创建html页面

安装html-webpack-plugin依赖

npm install html-webpack-plugin -D

在根目录下新建index.html文件,添加如下代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"></div>
</body>
</html>

修改webpack.config.js配置

//webpack.config.js
const path = require('path')
const HtmlWebpackplugin = require('html-webpack-plugin');  //++

module.exports = {
    //指定打包模式
    mode: 'development',
    entry: {...
    },
    output: {...
    },
    module: {...
    },
    plugins:[  //++
        new HtmlWebpackplugin({
            filename: 'index.html', // 打包后的文件名,默认是index.html   
            template: path.resolve(__dirname, '../index.html') // 导入被打包的文件模板
        })
    ]
}

运行npm run build ,我们可以看到dist文件夹下有一个index.html生成了,而且还引入了src/main.js的压缩包main.js

2.4安装配置并使用vue

npm install vue-loader vue-template-compiler cache-loader thread-loader -D
npm install vue -S
  • vue-loader 用于解析.vue文件
  • vue-template-compiler 用于编译模板
  • cache-loader 用于缓存loader编译的结果
  • thread-loader 使用 worker 池来运行loader,每个 worker 都是一个 node.js 进程。

修改webpack.config.js配置

//webpack.config.js
const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin');  //++
const HtmlWebpackplugin = require('html-webpack-plugin');  

module.exports = {
    //指定打包模式
    mode: 'development',
    entry: {...
    },
    output: {...
    },
    module: {
        rules: [
            ...
            {        //++
                test: /\.vue$/,
                use: [
                  {
                    loader: 'cache-loader'
                  },
                  {
                    loader: 'thread-loader'
                  },
                  {
                    loader: 'vue-loader',
                    options: {
                      compilerOptions: {
                        preserveWhitespace: false
                      },
                    }
                  }
                ]
              },
        ]
    },
    plugins:[  
        ...
        new VueLoaderPlugin()  //++
    ]
}

在src里新建App.vue

<template>
  <div class="App">
    Hello {{msg}}
  </div>
</template>

<script>
export default {
  name: 'App',

  data() {
    return {
        msg: "xiaoming",
    };
  }
};
</script>

修改src/main.js的代码:

import Vue from 'vue'
import App from './App.vue'

new Vue({
  render: h => h(App)
}).$mount('#app')

再次运行npm run build,然后在浏览器打开dist/index.html,可以发现vue已经可以运行了

2.4配置基础组件

npm install sass-loader dart-sass css-loader style-loader file-loader url-loader postcss-loader autoprefixer -D
  • sass-loaderdart-sass主要是将 scss/sass 语法转为css
  • css-loader主要是解析 css 文件
  • style-loader 主要是将 css 解析到 html页面 的 style 上
  • postcss-loader autoprefixer实现自动添加css3前缀

修改webpack.config.js配置

//webpack.config.js
// ...
            {
                test: /\.(scss|sass)$/,
                use: [
                    {
                        loader: 'style-loader'
                    },
                    {
                        loader: 'css-loader'
                    },
                    {
                        loader: 'sass-loader',
                        options: {
                            implementation: require('dart-sass')
                        }
                    },
                    {
                        loader: 'postcss-loader',
                        options: {
                            plugins: [
                                require("autoprefixer") /*自动添加前缀*/
                            ]
                        }
                    }
                ]
            },
            {
                test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svg|svgz)(\?.+)?$/,
                use: [{
                  loader: 'url-loader',
                  options: {
                    limit: 10000
                  }
                }]
            }
            // ...

在src/App.vue后面加入下面样式代码:

...
<style lang="scss" scoped>
.App {
  color: skyblue;
}
</style>

运行后,我们可以看到样式代码生效了

3、安装本地服务及代码热更新

安装webpack-dev-server

npm install webpack-dev-server -D

修改webpack.config.js配置

// ...
    output: {
        //配置打包文件输出的目录
        path: path.resolve(__dirname, '../dist'),
        //生成的js文件名称
        filename: 'js/[name].[hash:8].js',
        //生成的chunk名称
        chunkFilename: 'js/[name].[hash:8].js',
        //资源引用路径
        publicPath: '/'               //这里的./改成/
    },
    devServer: {  //++
        hot: true,
        port: 8088
    },
// ...

在package.json的scripts中增加一行启动本地服务指令:

"dev": "webpack-dev-server --progress --config ./build/webpack.config.js"

此时运行 npm run dev 可以启动本地服务,修改代码保存后,浏览器会自动进行更新

4、安装vue-router组件

安装vue-router

npm install vue-router --save

新增视图组件 在 src 目录下新增两个视图组件 src/views/page1.vue 和 src/views/page2.vue

// src/views/page1.vue
<template>
  <div class="page1">
    page1
  </div>
</template>




// src/views/page2.vue
<template>
  <div class="page2">
    page2
  </div>
</template>

在 src 目录下新增一个 router/index.js 文件

// src/router/index.js
import Vue from 'vue'
import VueRouter from "vue-router";
import page1 from '../view/page1.vue';
import page2 from '../view/page2.vue';
Vue.use(VueRouter)
export default new VueRouter({
  mode: 'hash',
  routes: [
    {
      path: '/page1',
      component: page1
    },
    {
      path: '/page2',
      component: page2
    },
    {
      path: '*',
      redirect: '/page2'
    }
  ]
})

修改 main.js 文件

// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

修改 App.vue 组件

// App.vue
<template>
  <div class="App">
    <div>
    Hello {{msg}}
    </div>
    <div>
        <router-link to="/page1">go page1</router-link>
        <router-link to="/page2">go page2</router-link>
        </div>
        <div>
        <router-view></router-view>
        </div>
  </div>
</template>

<script>
export default {
  name: 'App',

  data() {
    return {
        msg: "xiaoming",
    };
  }
};
</script>
<style lang="scss" scoped>
.App {
  color: skyblue;
}
</style>

运行npm run dev命令,可以看到如下效果

4、区分开发环境和生产环境

在build文件下新建两个文件

  • webpack.dev.js 开发环境使用
  • webpack.prod.js 生产环境使用
  • webpack.config.js 公用配置

安装所需依赖

npm i @intervolga/optimize-cssnano-plugin mini-css-extract-plugin clean-webpack-plugin webpack-merge -D
  • @intervolga/optimize-cssnano-plugin 用于压缩css代码
  • mini-css-extract-plugin 用于提取css到文件中
  • clean-webpack-plugin 用于删除上次构建的文件
  • webpack-merge 合并 webpack配置

开发环境配置

const merge = require('webpack-merge')
const webpackConfig = require('./webpack.config')
const webpack = require('webpack')
module.exports = merge(webpackConfig, {
  mode: 'development',
  devtool: 'cheap-module-eval-source-map',
  module: {
    rules: [
      {
        test: /\.(scss|sass)$/,
        use: [
          {
            loader: 'style-loader'
          },
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2
            }
          },
          {
            loader: 'sass-loader',
            options: {
              implementation: require('dart-sass')
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              compilerOptions: {
                preserveWhitespace: false
              },
            }
          }
        ]
      },
    ]
  },
})

生产环境配置

const path = require('path')
const merge = require('webpack-merge')
const webpack = require('webpack')
const webpackConfig = require('./webpack.config')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCssnanoPlugin = require('@intervolga/optimize-cssnano-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = merge(webpackConfig, {
  mode: 'production',
  devtool: '#source-map',
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendors: {
          name: 'chunk-vendors',
          test: /[\\\/]node_modules[\\\/]/,
          priority: -10,
          chunks: 'initial'
        },
        common: {
          name: 'chunk-common',
          minChunks: 2,
          priority: -20,
          chunks: 'initial',
          reuseExistingChunk: true
        }
      }
    }
  },
  module: {
    rules: [
      {
        test: /\.(scss|sass)$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader
          },
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2
            }
          },
          {
            loader: 'sass-loader',
            options: {
              implementation: require('dart-sass')
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                require("autoprefixer") 
                ]
            }
          }
        ]
      },
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/[name].[contenthash:8].css',
      chunkFilename: 'css/[name].[contenthash:8].css'
    }),
    new OptimizeCssnanoPlugin({
      sourceMap: true,
      cssnanoOptions: {
        preset: [
          'default',
          {
            mergeLonghand: false,
            cssDeclarationSorter: false
          }
        ]
      }
    }),
    new CleanWebpackPlugin()
  ]
})

公共配置

//webpack.config.js
const path = require('path')
const HtmlWebpackplugin = require('html-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');


module.exports = {
    //指定打包模式
    mode: 'development',
    entry: {
        //配置入口文件
       main: path.resolve(__dirname, '../src/main.js')
    },
    output: {
        //配置打包文件输出的目录
        path: path.resolve(__dirname, '../dist'),
        //生成的js文件名称
        filename: 'js/[name].[hash:8].js',
        //生成的chunk名称
        chunkFilename: 'js/[name].[hash:8].js',
        //资源引用路径
        // publicPath: './'
    },
    devServer: { //node本地服务器
        hot: true,
        port: 8088
    },
    module: {
        rules: [
            {   //将js或者jsx文件转码成es5
                test: /\.jsx?$/,    // 正则惰性匹配后缀名为js或者jsx的文件
                exclude: /node_modules/,    //排除node_modules文件夹
                use: {
                   loader: 'babel-loader',
                    options: {
                        presets:['@babel/preset-env']
                    } 
                }
            },
            {       
                test: /\.vue$/,
                use: [
                  {
                    loader: 'cache-loader'
                  },
                  {
                    loader: 'thread-loader'
                  },
                  {
                    loader: 'vue-loader',
                    options: {
                      compilerOptions: {
                        preserveWhitespace: false
                      },
                    }
                  }
                ]
              },
            {
                test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svg|svgz)(\?.+)?$/,
                use: [{
                  loader: 'url-loader',
                  options: {
                    limit: 10000
                  }
                }]
            }
        ]
    },
    plugins:[
        new VueLoaderPlugin(),
        new HtmlWebpackplugin({
            filename: 'index.html', // 打包后的文件名,默认是index.html   
            template: path.resolve(__dirname, '../index.html') // 导入被打包的文件模板
        })
    ]
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手动搭建VUE开发环境 的相关文章

  • vscode基本插件安装与配置

    插件安装 xff1a Auto Rename Tag 重命名标签时 xff0c 自动更新结尾配对的标签 Chinese 汉化 ESLint 规范化代码 xff0c 对应的setting配置 xff08 全局所有项目都有效 xff09 xff
  • Ubuntu20.04(Noetic)版本中关于“使用rospack命令工具来查看这些一级依赖包“报错解决方法

    ROS Noetic版本中关于 使用rospack命令工具来查看这些一级依赖包 报错解决方法 问题描述 xff1a 在跟随ROS初级教程 创建ROS软件包这一步骤 xff0c 可能会遇见下面问题 xff1a smw 64 smw Lenov
  • 最详细的Ubuntu18配置px4_ros_gazebo仿真

    本教程将在Ubuntu18安装ros px4工具链 以及gazebo仿真环境 参考此教程可以在Ubuntu16的环境安装ros px4工具链 以及gazebo仿真环境 首先 xff0c 我们来看下Ubuntu各版本对应的gazebo关系 x
  • 百度获取toke

    https aip baidubce com oauth 2 0 token grant type 61 client credentials amp client id 61 官网获取的AK amp client secret 61 官网
  • 详细的EVE-NG部署方法+EVE各种镜像与模板,附带SCRT+WINSCP等工具提供(VM部署)

    自己写的一份较详细的EVE NG在虚拟机VM上部署的教程 xff0c 喜欢的可以关注一下 xff0c 谢谢 首先我在百度云附上了EVE NG社区版2 0 3 110版本的OVF文件 xff0c 此次用这个版本来演示 xff0c 并且还提供了
  • node.js环境一键部署

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Golang Interface小结

    1 概述 1 1 简介 接口是一种规范 xff0c 描述了类的行为和功能 xff0c 而不做具体实现 C 43 43 定义接口的方式称为 侵入式 xff0c 而Go采用的是 非侵入式 xff0c 不需要显式声明 xff0c 只需要实现了接口
  • UART 简介

    1 引脚 UART 是一种异步全双工通信方式 xff0c 所以除了电源引脚之外 xff0c UART 常有引脚有 TXD xff0c RXD xff1b 除此之外还有硬件流控引脚 RTS 和 CTS TXD 是发送引脚 xff0c RXD
  • 无人机飞控三大算法:捷联式惯性导航系统、卡尔曼滤波算法、飞行控制PID算法

    无人机飞控三大算法 xff1a 捷联式惯性导航系统 卡尔曼滤波算法 飞行控制PID算法 一 捷联式惯性导航系统 说到导航 xff0c 不得不说GPS xff0c 他是接受卫星发送的信号计算出自身位置的 xff0c 但是当GPS设备上方被遮挡
  • [学习笔记-01]关于单片机的中断处理机制(一)

    单片机的中断处理机制 1 什么是中断 xff1f 1 1 为什么要使用中断 中断的特点 1 2 什么是中断源 xff1f 1 2 1中断源有哪些 2 中断机制的流程3 中断优先级3 1 多个中断同时发生3 2 中断嵌套 1 什么是中断 xf
  • 黑苹果突然某一天无法上网?可能设置了BIOS,这样可以有网了!

    如图所示 xff0c 本人是微星迫击炮B450 xff08 非MAX xff09 xff0c 进入BIOS设置网卡 xff0c 可以解决这样的没网的问题 如果各位的BIOS不是微星 xff0c 也没有关系 xff0c 可以找到类似的功能就可
  • LSTM模型、双向LSTM模型以及模型输入输出的理解

    循环神经网路 xff08 RNN xff09 在工作时一个重要的优点在于 xff0c 其能够在输入和输出序列之间的映射过程中利用上下文相关信息 然而不幸的是 xff0c 标准的循环神经网络 xff08 RNN xff09 能够存取的上下文信
  • 无人机中的PID控制代码略解

    无人机中的PID控制代码略解 PID的控制规律 xff1a 参考 xff1a Amov实验室 PX4中级课程 PID基础 频域函数 xff1a u s
  • 如何用Python在图片上绘制BoundingBox

    参考资料 xff1a https blog csdn net weixin 41735859 article details 106599903 在目标检测等CV领域的任务里 xff0c 经常会涉及到在图片上绘制BBox xff0c 也就是
  • uart

    1 关于UART的基本特性 xff1a xff08 1 xff09 异步串行通信 xff0c 可为全双工 半双工 单发送TX或单接收RX模式 xff1b xff08 2 xff09 支持5 xff5e 8位数据位的配置 xff0c 波特率几
  • STM32--数码管显示使用

    STM32 数码管显示 简介 1 硬件部分 STM32F103C8T6 最小系统板 一位共阴数码管 2 软件部分 Keil软件编程 数码管码表 硬件部分 数码管 简介 数码管 xff0c 也称作辉光管 xff0c 是一种可以显示数字和其他信
  • LXC 和 LXD 容器总结

    1 概述 1 1 LXC LXC是Linux Containers的缩写 它是一种虚拟化技术 xff0c 通过一个Linux内核在一个受控主机上虚拟地运行多个Linux系统 LXC使用内核的Cgroups功能 xff0c 来提供进程和网络空
  • Altium designer -- 基本规则设置--间距设置Clearance

    Altium designer 基本规则设置 xff08 1 xff09 间距设置Clearance 硬件设计 软件 Altium designer 10PCB设计 间距设置 规则名称1 xff1a Clearance 一般间距 最小间距
  • Python 百度智能云文字识别 实现手写文字识别

    Python 实现手写文字识别 简介 百度智能云人工智能平台文字识别接口使用下载IP摄像头应用 调用手机摄像头 xff0c 实现拍照实现文字识别 Python 百度智能云人工智能文字识别接口 实现手写文字识别 百度智能云 创建应用 创建Py
  • Python 天气 简单 数据分析及可视化

    Python 天气情况数据分析及可视化 环境配置 Pycharm开发环境 python 版本 python3 7 Anconda 集成开发环境 第三方库导入 span class token comment pip install 模块 清

随机推荐