源码: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页面 },