目录结构

├── node_modules
├── static
├── src
| └── css
| └── js
| └── img
├── .babelrc
├── index.html
├── package.json
├── webpack.common.js
├── webpack.dev.js
├── webpack.prod.js

webpack.common.js

  1. const path = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin');
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  4. const CopyWebpackPlugin = require('copy-webpack-plugin');
  5. module.exports = {
  6. entry: {
  7. app: './src/js/index.js'
  8. },
  9. output: {
  10. filename: './js/[name].[hash].js',
  11. path: path.resolve(__dirname, 'dist')
  12. },
  13. module: {
  14. rules: [
  15. {
  16. test: /\.js$/,
  17. exclude: /node_modules/,
  18. loader: 'babel-loader'
  19. },
  20. {
  21. test: /\.scss$/,
  22. use: [
  23. {
  24. loader: MiniCssExtractPlugin.loader,
  25. options: {
  26. hmr: process.env.NODE_ENV === 'development',
  27. publicPath:'../'
  28. },
  29. },
  30. 'css-loader',
  31. 'sass-loader'
  32. ]
  33. },
  34. {
  35. test: /\.(png|svg|jpg|gif)/,
  36. use: [
  37. {
  38. loader: "url-loader",
  39. options: {
  40. limit: 10000,
  41. outputPath: 'images',
  42. esModule: false
  43. }
  44. },
  45. ]
  46. },
  47. {
  48. test: /\.(htm|html)$/i,
  49. use: ['html-withimg-loader']
  50. }
  51. ]
  52. },
  53. plugins: [
  54. new HtmlWebpackPlugin({
  55. filename: "index.html",
  56. template: "./index.html",
  57. }),
  58. new MiniCssExtractPlugin({
  59. filename:"./css/[name].css",
  60. }),
  61. new CopyWebpackPlugin([
  62. {
  63. from: path.resolve(__dirname, './static'),
  64. to: 'static',
  65. ignore: ['.*']
  66. }
  67. ])
  68. ],
  69. };

webpack.dev.js

  1. const path = require('path');
  2. const {merge} = require('webpack-merge');
  3. const common = require('./webpack.common');
  4. const DevConfig = {
  5. host: "localhost",
  6. port: "8080",
  7. };
  8. module.exports = merge(common, {
  9. devtool: 'inline-source-map',
  10. devServer: {
  11. host: DevConfig.host,
  12. port: DevConfig.port,
  13. }
  14. });

webpack.prod.js

  1. const {merge} = require('webpack-merge');
  2. const common = require('./webpack.common.js');
  3. const {CleanWebpackPlugin} = require('clean-webpack-plugin');
  4. module.exports = merge(common, {
  5. plugins:[
  6. new CleanWebpackPlugin(),
  7. ]
  8. });

.babelrc

  1. {
  2. "presets": [
  3. [
  4. "@babel/preset-env",
  5. {
  6. "useBuiltIns": "usage",
  7. "targets": {
  8. "browsers": ["last 2 versions", "ie >= 10"]
  9. }
  10. }
  11. ]
  12. ]
  13. }

package.json

  1. {
  2. "name": "webpack",
  3. "version": "1.0.0",
  4. "description": "",
  5. "private": true,
  6. "scripts": {
  7. "build": "webpack --mode production --config webpack.prod.js",
  8. "start": "webpack-dev-server --mode development --open --config webpack.dev.js"
  9. },
  10. "keywords": [],
  11. "author": "",
  12. "license": "ISC",
  13. "dependencies": {
  14. "@babel/core": "^7.11.6",
  15. "@babel/polyfill": "^7.11.5",
  16. "@babel/preset-env": "^7.11.5",
  17. "babel-loader": "^8.1.0",
  18. "clean-webpack-plugin": "^3.0.0",
  19. "copy-webpack-plugin": "^4.0.1",
  20. "css-loader": "^4.3.0",
  21. "file-loader": "^6.1.0",
  22. "html-webpack-plugin": "^4.5.0",
  23. "html-withimg-loader": "^0.1.16",
  24. "mini-css-extract-plugin": "^0.11.2",
  25. "node-sass": "^4.14.1",
  26. "sass-loader": "^10.0.2",
  27. "style-loader": "^1.2.1",
  28. "url-loader": "^4.1.0",
  29. "webpack": "^4.44.2",
  30. "webpack-cli": "^3.3.12",
  31. "webpack-dev-server": "^3.11.0",
  32. "webpack-merge": "^5.1.4"
  33. }
  34. }