webpack 浅尝辄止系列——webpack vue 的第一扇门

源码:GitHub - leelun/webpack-vue-helloworld

好久不发文章,连发表按钮找了好一会【捂脸】

说明:网上看了几篇教程,都不对付,门都还没入,就耽误几个小时,还是老实的自己去官网了解一下。本人是一名后台开发,不是专业前端,只做快速搭建进入webpack vue快速进入状态说明,不做深入研究,对于前端的童鞋最好前往[官网](概念 | webpack 中文文档)进行系统学习。

以下只是做学习的一种方式说明,以官网为准,npm 安装的包一点版本不同就可能一直报错。

webpack 浅尝辄止系列——第一个webpack项目搭建

1 项目初始化

官网文档配置文档说明

# 创建目录进入目录
mkdir webpack-demo && cd webpack-demo
# 项目初始化
npx webpack-cli init
# 接下来根据提示选择自己需要的插件包
...

选择TypeScript而不是es6理由——官网说明:TypeScript 是 JavaScript 的超集,为其增加了类型系统,可以编译为普通 JavaScript 代码。

选择PostCSS理由——Github文档说明,功能很强大

初始化完成,下面是我选择的依赖包

+ sass-loader@12.4.0
+ html-webpack-plugin@5.5.0
+ webpack-dev-server@4.7.3
+ css-loader@6.5.1
+ sass@1.48.0
+ webpack-cli@4.9.1
+ style-loader@3.3.1
+ ts-loader@9.2.6
+ typescript@4.5.4
+ postcss@8.4.5
+ prettier@2.5.1
+ autoprefixer@10.4.2
+ webpack@5.66.0
+ postcss-loader@6.2.1
added 336 packages from 263 contributors, removed 281 packages, updated 3 packages and moved 19 packages in 44.959s

初始化后项目结构图

初始化后package.js

{
  "version": "1.0.0",
  "description": "My webpack project",
  "name": "my-webpack-project",
  "scripts": {
    "build": "webpack --mode=production --node-env=production",
    "build:dev": "webpack --mode=development",
    "build:prod": "webpack --mode=production --node-env=production",
    "watch": "webpack --watch",
    "serve": "webpack serve"
  },
  "devDependencies": {
    "autoprefixer": "^10.4.2",
    "css-loader": "^6.5.1",
    "html-webpack-plugin": "^5.5.0",
    "postcss": "^8.4.5",
    "postcss-loader": "^6.2.1",
    "prettier": "^2.5.1",
    "sass": "^1.48.0",
    "sass-loader": "^12.4.0",
    "style-loader": "^3.3.1",
    "ts-loader": "^9.2.6",
    "typescript": "^4.5.4",
    "webpack": "^5.66.0",
    "webpack-cli": "^4.9.1",
    "webpack-dev-server": "^4.7.3"
  }
}

初始化自动得到配置文件官方配置文档

​
// Generated using webpack-cli https://github.com/webpack/webpack-cli
//path模块 路径处理工具
const path = require("path");
//简化了HTML创建 该插件将为你生成一个 HTML5 文件, 在 body 中使用 script 标签引入所有 webpack 生成的 bundle。
const HtmlWebpackPlugin = require("html-webpack-plugin");
​
//process.env.NODE_ENV 对应上面--node-env=production
const isProduction = process.env.NODE_ENV == "production";
​
const stylesHandler = "style-loader";
​
const config = {
  entry: "./src/index.ts",//入口文件
  output: {//编译后输出目录 及通常npm run build后
    path: path.resolve(__dirname, "dist"),
  },
  devServer: {//web服务配置
    open: true,
    host: "localhost",
  },
  plugins: [//插件配置
    new HtmlWebpackPlugin({
      template: "index.html",
    }),
​
    // Add your plugins here
    // Learn more about plugins from https://webpack.js.org/configuration/plugins/
  ],
  module: {// 模块配置相关
    rules: [// 模块规则(配置 loader、解析器等选项)
      {
        test: /\.(ts|tsx)$/i,
        loader: "ts-loader",
        exclude: ["/node_modules/"],
      },
      {
        test: /\.s[ac]ss$/i,
        use: [stylesHandler, "css-loader", "postcss-loader", "sass-loader"],
      },
      {
        test: /\.css$/i,
        use: [stylesHandler, "css-loader", "postcss-loader"],
      },
      {
        test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
        type: "asset",
      },
​
      // Add your rules for custom modules here
      // Learn more about loaders from https://webpack.js.org/loaders/
    ],
  },
  resolve: {
        extensions: ['.ts', '.vue', '.json', ".js", '.png', ".sass",".css"],
        alias: {
                '@': resolve('src')
        }
    },
};
​
module.exports = () => {
  if (isProduction) {
    config.mode = "production";
  } else {
    config.mode = "development";
  }
  return config;
};
​

2 安装js工具库

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库 查看各个构件版本的区别并选择一个适合你的版本。功能强大,兼容性强。官网说明

npm install --save lodash

3 对配置文件进行开发配置

webpack.config.js

output 配置

 output: {
     filename: '[name].bundle.js',//name对应多入口
     path: path.resolve(__dirname, 'dist'),
    clean: true,//每次构建时清空之前的dist输出目录
   }

设置title

plugins: [
     new HtmlWebpackPlugin({
       title: '网页显示title',//filename title不能同时配置
     }),
   ]

开发环境

const config = {
     mode: 'development',
     ...
}

source map 定位错误

const config = {
     devtool: 'inline-source-map',
     ...
}

配置引入文件@

resolve: {
        extensions: ['.ts', '.vue', '.json', ".js", '.png', ".sass",".css"],
        alias: {
            '@': path.join(__dirname, '.', 'src')//'.'根据当前配置webpack.config.js而定
        }
    }

将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件

# 安装后的版本总是配置不成功,这里我是把它的版本号改为2.4.5
npm install --save-dev mini-css-extract-plugin

配置

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
​
module.exports = {
  plugins: [new MiniCssExtractPlugin()],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"],
      },
    ],
  },
}

优化和压缩 CSS。

[官网文档](CssMinimizerWebpackPlugin | webpack 中文文档

npm install css-minimizer-webpack-plugin --save-dev
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
​
module.exports = {
  module: {
    rules: [
      {
        test: /.s?css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
      },
    ],
  },
  optimization: {
    minimizer: [
      // 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
      // `...`,
      new CssMinimizerPlugin(),
    ],
  },
  plugins: [new MiniCssExtractPlugin()],
};

生产环境下默认使用 TerserPlugin ,并且也是代码压缩方面比较好的选择

安装

npm install --save-dev closure-webpack-plugin google-closure-compiler

配置

const ClosurePlugin = require('closure-webpack-plugin');
​
module.exports = {
  optimization: {
    minimizer: [
      new ClosurePlugin({mode: 'STANDARD'}, {
        // compiler flags here
        //
        // for debugging help, try these:
        //
        // formatting: 'PRETTY_PRINT'
        // debug: true,
        // renaming: false
      })
    ]
  }
};

4 安装vue开发需要包

vue 相关 qs请求转化 加密解密 请求相关

npm install vue vuex vue-router qs crypto-js axios

开发环境依赖包

    npm install  vue-loader vue-template-compiler --save-dev

5 配置vue环境

(1) webpack.config.js

// Generated using webpack-cli https://github.com/webpack/webpack-cli
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { VueLoaderPlugin } = require('vue-loader');
...
const config = {
...
    resolve: {//加入.vue解析
        extensions: ['.ts', '.vue', '.json', ".js", '.png', ".sass", ".css"],
        alias: {
            '@': path.join(__dirname, '.', 'src')
        }
    },
    plugins: [
    ...
        new HtmlWebpackPlugin({
            filename: "index.html",
            template: "index.html" //指定模板文件加入 <div id="app"></div>
        }),
        new VueLoaderPlugin(),//vue加载插件
    ],
    module: {
    ...
        rules: [
            {//vue规则
                exclude: /node_modules/,
                test: /\.vue$/,
                loader: 'vue-loader',
            },
        ],
    },
 
};
​

(2) index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Webpack App</title>
    </head>
    <body>
        <h1>Hello world!</h1>
        <h2>Tip: Check your console</h2>
        <div id="app"></div>
    </body>
    
</html>

(3) 将入口文件index.js内容修改,这里如果习惯之前的vue构建项目可以修改为main.js 把入口文件名称修改下就行

import Vue from 'vue'
import App from './App.vue'
Vue.directive('title', {
    inserted: function (el, binding) {
        document.title = el.dataset.title
    }
})
​
Vue.config.productionTip = false
​
new Vue({
    el: '#app',
    render: h => h(App)
})

(4) App.vue

<template>
  <div id="app">
      <hello-world/>
  </div>
</template>
​
<script>
import HelloWorld from '@/components/HelloWorld'
export default {
  name: 'App',
  components:{
    HelloWorld
  }
}
</script>
​
<style lang='scss'>
#app {
    height: 100%;
    > div {
        height: 100%;
    }
}
</style>

(5) HelloWorld.vue

<template>
    <p>helloworld</p>
</template>
<script lang="ts">
​
export default {
    name:"HelloWorld"
}
</script>
<style scoped>
​
</style>

6 快速开发

npx webpack-cli init
npm install --save lodash vue vuex vue-router qs crypto-js axios
npm install --save-dev mini-css-extract-plugin  vue-loader vue-template-compiler closure-webpack-plugin google-closure-compiler css-minimizer-webpack-plugin

7 开发问题

vue webpack之vue-router 使用history模式报错Cannot GET /xxx在webpack.config.js中的devServer内添加属性historyApiFallback

historyApiFallback: {
    index: '/index.html'//该路径为打包后的首页路径及dist目录下的index.html页面
  },
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光影下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值