webpack 简介

webpack 是前端开发必备的工具,由 node.js 编写,主要用来打包和输出静态资源,
它将各种文件视为模块,根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。

webpack 基本配置

webpack有五大基本配置:

entry

指定打包文件的入口( index.js

output

指定打包输出的文件位置

loader

加载器,webpack自身只能处理 js ,加载其他资源例如样式文件,图片资源等需要配置相应的 loader

plugin

用来拓展webpack的功能,例如打包优化和压缩,定义环境中的变量等。

mode

模式,指定开发模式(development)和生产模式(production),开发模式打包的代码没有压缩,便于调试

mode 描述 特点
development 会将 DefinePlugin 中 process.env.NODE_ENV 的值设置为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin。 方便代码本地调试,但css-loader使css集成在js中,代码没有压缩,可能存在兼容性问题
production production会将 DefinePlugin 中 process.env.NODE_ENV 的值设置为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 TerserPlugin。 优化上线功能,单独抽取css,进行代码压缩,解决兼容性

简单实例

本实例要求可以处理css,less,图片资源,字体资源
代码: webpack-study/webpack-demo1

开发依赖

开发依赖见 package.jsondevDependencies

  1. "devDependencies": {
  2. "css-loader": "^5.1.0",
  3. "file-loader": "^6.2.0",
  4. "html-webpack-plugin": "^5.2.0",
  5. "html-withimg-loader": "^0.1.16",
  6. "less": "^4.1.1",
  7. "less-loader": "^8.0.0",
  8. "style-loader": "^2.0.0",
  9. "url-loader": "^4.1.1",
  10. "webpack": "^5.24.1",
  11. "webpack-cli": "^4.5.0",
  12. "webpack-dev-server": "^3.11.2"
  13. }

配置文件

webpack 的配置文件 webpack.config.js
打包运行命令: npx webpack

  1. // path 为node自带的模块,resolve用来拼接路径
  2. const {resolve} = require('path')
  3. const HtmlWebpackPlugin = require('html-webpack-plugin')
  4. module.exports = {
  5. entry: './src/index.js',
  6. output: {
  7. filename: 'built.js',
  8. path: resolve(__dirname, 'build'), // path 为拼接的绝对路径
  9. // __dirname 表示当前文件(webpack.config.js)的绝对路径
  10. },
  11. module:{
  12. rules: [
  13. // loader 配置,loader 倒序执行
  14. {
  15. test: /\.css$/,
  16. use: ['style-loader', 'css-loader']
  17. // css-loader: 加载css,将css文件变成commonjs模块加载到js中,里面内容是样式字符串
  18. // style-loader:创建style标签,将js中的样式资源插入进去,添加到head中生效
  19. },
  20. {
  21. test: /\.less$/,
  22. use: ['style-loader', 'css-loader', 'less-loader']
  23. // less-loader: 将less文件编译成css文件,需要下载less-loader和less
  24. },
  25. {
  26. test: /\.(png|jpg|gif)$/,
  27. loader: 'url-loader',
  28. // 只能处理非html中的图片资源,例如
  29. // 1. css background中的 url
  30. // 2. js 中 import * as url from './a.jpg'
  31. // 3. js 中 const url = require('./a.jpg')
  32. // url-loader会调用file-loader,所以需要下载file-loader
  33. options:{
  34. name: '[hash:10].[ext]',
  35. limit: 3 * 1024,
  36. // 图片超过 3kb 使用base64 加载,可以减少请求
  37. esModule: false,
  38. // url-loader默认使用es6模块加载,false关闭es6使用commonjs
  39. outputPath: 'imgs' // 图片资源输出路径
  40. }
  41. },
  42. {
  43. test: /\.html$/,
  44. loader: 'html-withimg-loader',
  45. // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
  46. // url-loader esModule:false 保证用commonjs解析
  47. },
  48. {
  49. exclude: /\.(html|js|css|less|jpg|png|gif)/,
  50. // 上述文件类型以外,例如字体文件
  51. loader: 'file-loader',
  52. options:{
  53. name: '[hash:10].[ext]',
  54. outputPath: 'media'
  55. }
  56. }
  57. ]
  58. },
  59. mode: 'development',
  60. plugins:[
  61. new HtmlWebpackPlugin({
  62. template: './src/index.html'
  63. // 根据template指定的html文件,将打包后的js引入
  64. })
  65. ],
  66. devServer: { // 方便开发的服务器,主要是用来自动化(自动编译,自动打开,刷新浏览器)
  67. // 返回 build 之后的代码,不输出代码,只在内存中编译打包
  68. // 需要安装依赖 webpack-dev-server,
  69. // webpack-cli ^4 以上启动命令 npx webpack serve
  70. contentBase: resolve(__dirname, 'build'),
  71. compress: true,// gzip 压缩
  72. port: 3000,
  73. open: true, // 自动打开浏览器
  74. }
  75. }