webpack 4.0 学习笔记(一)
1.webpack可以做哪些事儿
代码的转换,文件的优化,代码的分割,模块的合并,代码的校验,自动更新,自动发布,等等。
2.安装webpack
npm init 新建项目
npm install webpack webpack-cli -D
3.简单配置,运行webpack,查看打包是否正确
const path = require('path'); module.exports = { mode: 'development', // 模式 默认两种 production 生产 development 开发 entry: './src/index.js', // 入口文件 output: { path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲 filename: 'index.js' // 打包后的文件夹 } }
package.json
{ "name": "weppack-dome", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack --config webpack.config.js" // --config 添加参数,运行哪个文件下的配置 }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "webpack": "^4.34.0", "webpack-cli": "^3.3.4" } }
运行 npm run build
4.使用webpack-dev-server 构建一个简单的web服务器,能实现修改代码后自动刷新
npm i webpack-dev-server -D
package.json
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack --config webpack.config.js", "dev": "webpack-dev-server --open" // 添加启动服务的命令 --open 自动打开浏览器 },
测试用在dist文件夹新建index.html 文件 引入打包之后的index.js 查看8080窗口是否能正常启动,并弹出helloworld 和 hello webpack
运行 npm run build (先打包) 在启动服务 npm run dev 能出现以下页面
在测试阶段dist内要提前新建好index.html文件 用于引入我们build之后的js,实际项目中不会这么做,下面来解决这个问题
5.使用 HtmlWebpackPlugin 插件来解决问题
简化了每次创建html,会随着编译而变化的html
npm i html-webpack-plugin -D 安装插件
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'production', // 模式 默认两种 production 生产 development 开发 entry: './src/index.js', // 入口文件 output: { path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲 filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的 }, devServer: { // web开发服务器的配置 port: 8080, // 指定开启的端口 progress: true, // 展示进度条 contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹 }, plugins: [ // 数组 放置插件 new HtmlWebpackPlugin({ hash: true, // 添加hash值 template: path.resolve(__dirname, 'src/index.html'), // 模板的位置 filename: 'index.html', // 输出文件名 title: 'webpack-dome', // 生成HTML的标题 minify: { // 代码压缩配置 removeAttributeQuotes: true, // 把html 文件双引号去掉 collapseWhitespace: true, // html文件引用的js添加hash值 } }) ] }
6.添加css-loader
npm i style-loader csss-loader -D
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'production', // 模式 默认两种 production 生产 development 开发 entry: './src/index.js', // 入口文件 output: { path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲 filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的 }, devServer: { // web开发服务器的配置 port: 8080, // 指定开启的端口 progress: true, // 展示进度条 contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹 }, module: { //模块 rules: [ // 规则 { test: /\.css$|.styl$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 { loader: 'style-loader' // 把css文件插入到head的标签中 }, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 ] } ] }, plugins: [ // 数组 放置插件 new HtmlWebpackPlugin({ hash: true, // 添加hash值 template: path.resolve(__dirname, 'src/index.html'), // 模板的位置 filename: 'index.html', // 输出文件名 title: 'webpack-dome', // 生成HTML的标题 minify: { // 代码压缩配置 removeAttributeQuotes: true, // 把html 文件双引号去掉 collapseWhitespace: true, // html文件引用的js添加hash值 } }) ] }
成功耶,更改配置文件要重新启动服务!有时候要自己更改css样式,会直接写一个标签,但是自己写的标签层级会比引入的低
在webpack.config.js 内更改配置
use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 { loader: 'style-loader', // 把css文件插入到head的标签中 options: { insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式 } }, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 ]
成功 yep!
7.安装stylus loader
npm i stylus stylus-loader -D
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'production', // 模式 默认两种 production 生产 development 开发 entry: './src/index.js', // 入口文件 output: { path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲 filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的 }, devServer: { // web开发服务器的配置 port: 8080, // 指定开启的端口 progress: true, // 展示进度条 contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹 }, module: { //模块 rules: [ // 规则 { test: /\.css$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 { loader: 'style-loader', // 把css文件插入到head的标签中 options: { insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式 } }, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 ] }, { test: /\.styl$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 { loader: 'style-loader', // 把css文件插入到head的标签中 options: { insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式 } }, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 'stylus-loader' // 解析 stylus语法 ] } ] }, plugins: [ // 数组 放置插件 new HtmlWebpackPlugin({ hash: true, // 添加hash值 template: path.resolve(__dirname, 'src/index.html'), // 模板的位置 filename: 'index.html', // 输出文件名 title: 'webpack-dome', // 生成HTML的标题 minify: { // 代码压缩配置 removeAttributeQuotes: true, // 把html 文件双引号去掉 collapseWhitespace: true, // html文件引用的js添加hash值 } }) ] }
新建styl文件 里面写css样式 在index.js 引入
页面会出现一个宽和高都为500的盒子 并且居中哦!
8.安装插件 把css样式抽离出去
现在都是混合写在style标签内 ,抽离成外链式的
npm i mini-css-extract-plugin -D
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); module.exports = { mode: 'production', // 模式 默认两种 production 生产 development 开发 entry: './src/index.js', // 入口文件 output: { path: path.resolve(__dirname, 'dist'), // 打包后输出文件,在当前目录下新建一个dist 文件夹 必须是绝对路劲 filename: 'index.[hash:8].js' // 打包后的文件夹 添加8位的 }, // devServer: { // web开发服务器的配置 // port: 8080, // 指定开启的端口 // progress: true, // 展示进度条 // contentBase: path.resolve(__dirname, 'dist'), //默认是以当前目录下开启静态服务,指定开启服务的文件夹 // }, module: { //模块 rules: [ // 规则 { test: /\.css$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 // { // loader: 'style-loader', // 把css文件插入到head的标签中 // options: { // insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式 // } // }, MiniCssExtractPlugin.loader, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 ] }, { test: /\.styl$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 // { // loader: MiniCssExtractPlugin.loader, // 把css文件插入到head的标签中 // options: { // insertAt: 'top' // 添加的位置在上面,方便自定义其他的css 样式 // } // }, MiniCssExtractPlugin.loader, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 'stylus-loader' // 解析 stylus语法 ] } ] }, plugins: [ // 数组 放置插件 new HtmlWebpackPlugin({ hash: true, // 添加hash值 template: path.resolve(__dirname, 'src/index.html'), // 模板的位置 filename: 'index.html', // 输出文件名 title: 'webpack-dome', // 生成HTML的标题 // minify: { // 代码压缩配置 // removeAttributeQuotes: true, // 把html 文件双引号去掉 // collapseWhitespace: true, // html文件引用的js添加hash值 // } }), new MiniCssExtractPlugin({ filename: 'main.css' }), new CleanWebpackPlugin() // 清楚打包文件下的内容 ] }
9.安装添加浏览器前缀
npm i postcss-loader autoprefixer -D
rules: [ // 规则 { test: /\.css$/, use: [ // 多个loader用数组,按顺序执行,配置单个loader用对象 MiniCssExtractPlugin.loader, 'css-loader', // 解析@import 语法,把css 文件中引入css的文件 { //浏览器兼容 loader: 'postcss-loader', options: { plugins: [ require('autoprefixer') /*在这里添加*/ ] } } ] },
10.添加css 压缩
npm install mini-css-extract-plugin optimize-css-assets-webpack-plugin terser-webpack-plugin -D
在webpack.config.js 引入
optimization: { minimizer: [ new TerserJSPlugin({}), // 压缩js new OptimizeCSSAssetsPlugin({}) // 压缩css ] },
11.添加babel转换js
npm install babel-plugin-dynamic-import-webpack babel-loader @babel/core @babel/preset-env -D
rules: [ // 规则 { test: /\.js$/, use: [ { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } ] }, .... ]
在改项目根目录添加 .babelrc //解决import语法不能识别问题