webPack 作为前端开发工具的用途

  • 代码转换
  • 文件优化
  • 代码分割
  • 文件合并
  • 自动刷新
  • 代码校验
  • 自动发布

核心概念

  • 入口(entry)
  • 出口(output)
  • loader loader 让 webpack 能够去处理那些非 JavaScript 文件
  • 插件(plugins )

webPack 及其插件安装

  • 新建一个文件夹
  • 初始化 npm init -y
  • 安装 webPack, npm install webpack webpack-li -D (不加 -D 默认安装在生产环境,-D 表示安装在开发环境下,)

[ 运行 ]

  • package.json 文件的 scripts 属性中配置执行命令
    • 开发环境打包: “dev”: “webpack —mode development”
    • 生产环境打包:”build”: “webpack —mode production”
  • 运行 npm run 配置的命令

[ 插件安装 ]

  • html-webpack-plugin -D ( 把打包后的文件自动引入到 html 文件中)
  • clean-webpack-plugin -D (清空输出目录)
  • webpack-dev-server -D(创建本地服务器,自动重新构建,自动打开浏览器并刷新)
  • optimize-css-assets-webpack-plugin -D (压缩 css 代码 )
  • terser-webpack-plugin -D (css 压缩以后 默认的 js 压缩会失效 故 需要 覆盖默认压缩工具)

模块的规范

  • esModule 规范 (es6 模块)
    • 引入 import
    • 导出 export
  • commonJS 规范 (node 模块)
    • 引入 require
    • 导出 module.export

css 加载器

  • css 解析 加载器: css-loader style-loader -D
    • 如果 css 文件中引入 less 文件
  1. use: ['style-loader', {
  2. loader: 'css-loader',
  3. options:{
  4. importLoaders: 1 // 用后面('less-loader')的 1 个加载器来解析 ,如果是两个就是 2
  5. }
  6. },'less-loader'
  7. ]
  • less 解析 加载器: less less-loader -D
  • sass 解析 加载器: node-sass sass-loader -D
  • stylus 解析 加载器: stylus stylus-loader -D

[ 处理 css 私有前缀 ]

  • postcss-loader(样式处理工具,可以借助自定义插件重新定义 css) 如:autoprefixer(私有前缀的插件) -D
  1. /***
  2. * 需要配置 postcss.config.js 文件
  3. *
  4. *
  5. *
  6. */
  7. // 设置处理样式的配置文件
  8. module.exports = {
  9. plugins: [
  10. // 引入插件
  11. require('autoprefixer')
  12. ]
  13. }

[ 分离 css 插件 ] mini-css-extract-plugin -D

webpack.config.js 配置文件

  1. // 配置文件
  2. // node commonJS 规范
  3. const path = require('path');
  4. const {CleanWebpackPlugin} = require('clean-webpack-plugin');
  5. const HtmlWebpackPlugin = require('html-webpack-plugin');
  6. // 分离 css 插件
  7. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  8. // 压缩 css 代码
  9. const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  10. // 压缩 js 代码
  11. const TerserJSPlugin = require('terser-webpack-plugin');
  12. // console.log(__dirname); // 项目在本地存储中的绝对路径 E:\My Web\珠峰2019\FRAME\webPack\20191210
  13. // console.log(path.resolve(__dirname,"dist")); // 项目在本地存储中的绝对路径 E:\My Web\珠峰2019\FRAME\webPack\20191210\dist 一般使用 path.resolve(__dirname,dist)
  14. /**
  15. * path 中的其他方
  16. *
  17. */
  18. // 把打包后的文件自动引入到 html 文件中 如果文件过多优化
  19. let htmlPlugin = ['index','other'].map(chunckName=>{
  20. // console.log(chunckName);
  21. return new HtmlWebpackPlugin({
  22. template:`./${chunckName}.html`, // 注意此处不是引号
  23. filename:`${chunckName}.html`,
  24. chunks:[chunckName],
  25. })
  26. })
  27. module.exports = {
  28. /* entry: "./src/index.js", // 单个入口文件 必须使用相对路径
  29. output: {
  30. // 文件指纹: hash chunkHash contentHash 防止有缓存
  31. // filename:'bundle.[contentHash:8].js',
  32. filename:'bundle.js', //输出文件名
  33. path: path.resolve(__dirname,"dist") // 把路径地址解析为绝对地址
  34. }, */
  35. // 压缩 css js 代码
  36. optimization: {
  37. minimizer:[ // 压缩 css js 代码
  38. new OptimizeCssAssetsPlugin(),
  39. new TerserJSPlugin(),
  40. ]
  41. },
  42. // 多入口文件 多出口文件
  43. entry: {
  44. index:"./src/index.js",
  45. other:"./src/other.js"
  46. },
  47. output: {
  48. filename:'[name].js', // name 指 index other
  49. path: path.resolve(__dirname,"dist")
  50. },
  51. // 加载器
  52. module: {
  53. rules:[
  54. // 自下而上 解析 css 加载顺序 css-loader style-loader
  55. /* {
  56. test: /\.css$/, //匹配的文件
  57. use: 'css-loader'
  58. },
  59. {
  60. test: /\.css$/, //匹配的文件
  61. use: 'style-loader',
  62. enforce:'post' // pre 优先加载 post 最后加载
  63. } */
  64. // 合并书写 css 加载
  65. {
  66. test: /\.css$/, //匹配的文件
  67. // [] / {} / “” 水平方向解析 从右往左
  68. // use: ['style-loader', 'css-loader']
  69. // 如果 css 文件中引入 less 文件
  70. use: [
  71. // 'style-loader', 使用分离插件后 style-loader 不需要
  72. {
  73. loader: MiniCssExtractPlugin.loader,
  74. },
  75. {
  76. loader: 'css-loader',
  77. options:{
  78. importLoaders: 2 // 用后面的 1 个加载器来解析 ,如果是两个就是 2
  79. }
  80. },'postcss-loader','less-loader'
  81. ]
  82. },
  83. // less 加载 仅限于引入到 js 文件中的 less 文件
  84. {
  85. test: /\.less$/,
  86. use: ['style-loader','css-loader', 'less-loader' ]
  87. }
  88. ]
  89. },
  90. // 创建服务器
  91. devServer: { //在内存中打包,所有的内容在根目录下
  92. port: 8081,
  93. open: true, // 自动打开浏览器
  94. compress: true, //是否压缩代码,在内存中打包
  95. contentBase: "static", //直接启动 static 文件夹下的静态资源文件
  96. hot:true, //自动刷新
  97. },
  98. // 配置插件 自下而上执行
  99. plugins: [
  100. // 分离 css 插件
  101. new MiniCssExtractPlugin({
  102. filename: 'css/main.css', // 设置分离出的 css 的目录及文件名
  103. }),
  104. new CleanWebpackPlugin(), //清空输出目录
  105. // new CleanWebpackPlugin({
  106. // // cleanOnceBeforeBuildPatterns: ['**/*', '!static-files*'], 清空某一文件夹下的所有文件,但是不包含**
  107. // cleanOnceBeforeBuildPatterns: ['cc/*','!cc/a.js']
  108. // }),
  109. // 把打包后的文件自动引入到 html 文件中
  110. /* new HtmlWebpackPlugin({
  111. template:'./index.html' , //依赖的模板文件 html 文件
  112. hash:true,
  113. minify:{
  114. removeAttributeQuotes: true, //删除引号
  115. collapseWhitespace: true, //删除空格
  116. },
  117. filename:'index.html', //打包后的 html 文件名
  118. chunks: ['index'], //指定引入的入口 html 文件
  119. }),
  120. new HtmlWebpackPlugin({
  121. template:'./other.html' , //依赖的模板文件 html 文件
  122. hash:true,
  123. filename:'other.html', //打包后的 html 文件名
  124. chunks: ['other'], //指定引入的入口 html 文件
  125. }), */
  126. // 把打包后的文件自动引入到 html 文件中 如果文件过多优化
  127. ...htmlPlugin //把数组的每一项展开
  128. ]
  129. }