IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> webpack5构建一个小型简单vue项目 (练习) -> 正文阅读

[JavaScript知识库]webpack5构建一个小型简单vue项目 (练习)

webpack5构建vue

必要环境

安装ndejs

我们需要安装node 如果没有安装则安装 安装过则跳过

下载安装nodejs

执行

node -v
npm -v

在这里插入图片描述

初始化项目文件夹

新建一个空的项目

执行 npm init -y 初始化

npm init -y

会生成一个package.json

在这里插入图片描述

安装webpack以及 html-webpack-plugin

控制台执行

npm i webpack webpack-cli webpack-dev-server html-webpack-plugin -D

安装babel-loader

babel可以将我们的代码向下适配

npm i babel-loader @babel/core @babel/preset-env @babel/polyfill core-js@3 -D

安装 css-lodaer

支持less

npm install css-loader style-loader sass-loader postcss-loader autoprefixer less-loader  -D

安装 mini-css-extract-plugin css-minimizer-webpack-plugin

用来抽离压缩css 代码

npm i mini-css-extract-plugin css-minimizer-webpack-plugin -D

创建多个目录

创建多个文件夹 方便存放不同资源 参考vue-cli脚手架生成的

根目录下新建 webpack.config.js

src下创建main.ts 以及 App.vue

如下

在这里插入图片描述

public 目录下

我们放入一个ico文件
在这里插入图片描述

创建模板 html文件

webpack5内置了clean output开启即可

在 public目录下新建 index.html

<!DOCTYPE html>
<html lang="">
<head>
    <meta charset="UTF-8">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
    <strong><%= htmlWebpackPlugin.options.title %>:请检查js是否正常启用</strong>
</noscript>
<div id="app"></div>
</body>
</html>

开始构建vue项目

安装 vue-loader等

npm i vue-loader vue-template-compiler vue@next  vuex@next vue-router@next -D
npm install terser-webpack-plugin copy-webpack-plugin -D

配置webpack

webpack5内置了 clean 和 热更新

开启方式 在devServer配置

devServer: {
   hot: true,
   liveReload: true
},

在 webpack.config.js 文件中

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
const MiniCssExtract = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') //生产环境
const TerserPlugin = require('terser-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = (env) => {
  return {
    devServer: {
      port: 8888,
      hot: true,
      liveReload: true
    },

    mode: env.development ? 'development' : 'production',

    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    },

    entry: './src/main.js',

    output: {
      filename: "js/[name].[contenthash].js",
      // path: path.resolve(__dirname, 'dist/js'),
      clean: true,
      publicPath: "./"
    },
    module: {
      rules: [
        {
          test: /\.vue$/,
          loader: 'vue-loader'
        },
        {
          test: /\.js$/,
          exclude: file => (
            /node_modules/.test(file) &&
            !/\.vue\.js/.test(file)
          ),
          use: [
            {
              loader: 'babel-loader',
              options: {
                presets: [
                  [
                    '@babel/preset-env',
                    {
                      targets: [
                        'last 1 version', //浏览器最新的一个版本
                        '> 1%' //代码使用超过1%
                      ],
                      useBuiltIns: 'usage',
                      corejs: 3
                    }
                  ]
                ]
              }
            },
            {
              loader: "eslint-loader"
            }
          ]
        },
        {
          test: /\.(css|scss)$/,
          use: [env.development ? 'vue-style-loader'
            : MiniCssExtract.loader,
            {
              loader: 'css-loader'
            },
            {
              loader: 'sass-loader'
            }
          ]
        },
        {
          test: /\.(woff|woff2|eot|ttf|otf)$/,
          type: 'asset/resource'
        },
        {
          test: /\.(png|jpg|gif)$/,
          use: [
            {
              loader: "file-loader",
              options: {
                name:'img/[name].[hash].[ext]',
              }
            }


          ]
        }
      ]
    },

    optimization: {
      minimizer: [
        new CssMinimizerPlugin(),
        new TerserPlugin()
      ]
    },

    plugins: [
      new HtmlWebpackPlugin({
        title: "小型vue应用",
        template: "public/index.html",
        filename: "index.html",
        baseUrl: './icon/favicon.ico'
      }),
      new CopyWebpackPlugin({
        patterns:[
          {
            from: path.resolve(__dirname, './public/icon'),
            to: path.resolve(__dirname, './dist/icon'),
          }
        ]
      }),
      new MiniCssExtract({
        filename: 'css/style.css'
      }),
      new VueLoaderPlugin()
    ]

  }

}

修改package.json

在这里插入图片描述

初始化 eslint

eslint --init

选择 检查找到问题

选择 js 浏览器环境 不用ts

拆分配置文件

开发环境

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')

module.exports = {
  devServer: {
    port: 8888,
    hot: true,
    liveReload: true
  },

  mode: 'development',

  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  },

  entry: './src/main.js',

  output: {
    filename: "js/[name].[contenthash].js",
    // path: path.resolve(__dirname, 'dist/js'),
    publicPath: "/"
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        exclude: file => (
          /node_modules/.test(file) &&
          !/\.vue\.js/.test(file)
        ),
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: [
                [
                  '@babel/preset-env',
                  {
                    targets: [
                      'last 1 version', //浏览器最新的一个版本
                      '> 1%' //代码使用超过1%
                    ],
                    useBuiltIns: 'usage',
                    corejs: 3
                  }
                ]
              ]
            }
          },
          {
            loader: "eslint-loader"
          }
        ]
      },
      {
        test: /\.(css|scss)$/,
        use: ['vue-style-loader',
          {
            loader: 'css-loader'
            // ,
            // options: {
            //   modules:{
            //     localIdentName: '[local]_[hash:base64:8]'
            //   }
            // }
          },
          {
            loader: 'sass-loader'
            // options: {
            //   // sass-loader version >= 8
            //   sassOptions: {
            //     indentedSyntax: true
            //   }
            // }
          }
        ]
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        type: 'asset/resource'
      },
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          // {
          //   loader:'url-loader',
          //   options:{
          //     limit:4096,
          //     outputPath:'./img',
          //     name:'[name].[hash].[ext]',
          //   }
          // },
          {
            loader: "file-loader",
            options: {
              name:'img/[name].[hash].[ext]',
            }
          }


        ]
      }
    ]
  },

  plugins: [
    new HtmlWebpackPlugin({
      title: "小型vue应用",
      template: "public/index.html",
    }),
    new VueLoaderPlugin()
  ]

}

生产环境

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
const MiniCssExtract = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') //生产环境
const TerserPlugin = require('terser-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = () => {

  return {

    mode: 'production',

    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    },

    entry: './src/main.js',

    output: {
      filename: "js/[name].[contenthash].js",
      // path: path.resolve(__dirname, 'dist/js'),
      clean: true,
      publicPath: "./"
    },
    module: {
      rules: [
        {
          test: /\.vue$/,
          loader: 'vue-loader'
        },
        {
          test: /\.js$/,
          exclude: file => (
            /node_modules/.test(file) &&
            !/\.vue\.js/.test(file)
          ),
          use: [
            {
              loader: 'babel-loader',
              options: {
                presets: [
                  [
                    '@babel/preset-env',
                    {
                      targets: [
                        'last 1 version', //浏览器最新的一个版本
                        '> 1%' //代码使用超过1%
                      ],
                      useBuiltIns: 'usage',
                      corejs: 3
                    }
                  ]
                ]
              }
            },
            {
              loader: "eslint-loader"
            }
          ]
        },
        {
          test: /\.(css|scss)$/,
          use: [ MiniCssExtract.loader,
            {
              loader: 'css-loader'
              // ,
              // options: {
              //   modules:{
              //     localIdentName: '[local]_[hash:base64:8]'
              //   }
              // }
            },
            {
              loader: 'sass-loader'
              // options: {
              //   // sass-loader version >= 8
              //   sassOptions: {
              //     indentedSyntax: true
              //   }
              // }
            }
          ]
        },
        {
          test: /\.(woff|woff2|eot|ttf|otf)$/,
          type: 'asset/resource'
        },
        {
          test: /\.(png|jpg|gif)$/,
          use: [
            // {
            //   loader:'url-loader',
            //   options:{
            //     limit:4096,
            //     outputPath:'./img',
            //     name:'[name].[hash].[ext]',
            //   }
            // },
            {
              loader: "file-loader",
              options: {
                name:'img/[name].[hash].[ext]',
              }
            }


          ]
        }
      ]
    },

    optimization: {
      minimizer: [
        new CssMinimizerPlugin(),
        new TerserPlugin()
      ]
    },

    plugins: [
      new HtmlWebpackPlugin({
        title: "小型vue应用",
        template: "public/index.html",
        filename: "index.html",
        baseUrl: './icon/favicon.ico'
      }),
      new CopyWebpackPlugin({
        patterns:[
          {
            from: path.resolve(__dirname, './public/icon'),
            to: path.resolve(__dirname, './dist/icon'),
          }
        ]
      }),
      new MiniCssExtract({
        filename: 'css/style.css'
      }),
      new VueLoaderPlugin()
    ]

  }

}

测试

文件夹的基础文件 我复制的通过vue-cli创建的项目

运行
npm run start
在这里插入图片描述

打包
npm run build
在这里插入图片描述
在这里插入图片描述

拓展

这只是一个简单的项目

我们可以增加插件等赋予它更多能力

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:49:07  更:2022-01-28 11:51:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:53:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码