zoukankan      html  css  js  c++  java
  • webpack基础开发环境配置

    package.json中需要引入的基础依赖

    {
      "name": "XXX",
      "version": "1.0.0",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
    
    //基础类
        "webpack": "^4.41.6",
        "webpack-cli": "^3.3.12",
        "thread-loader": "^2.1.3",//多进程打包
        "webpack-dev-server": "^3.10.3",//运行指令 npx webpack-dev-server
        "add-asset-html-webpack-plugin": "^3.1.3",//将某个文件打包输出去,并在html中自动引入该资源
    //js
        "@babel/core": "^7.8.4",//babel核心库
        "@babel/polyfill": "^7.8.3",//全部js兼容性处理
        "@babel/preset-env": "^7.8.4",//基本js兼容性处理,高级语法不能转换
        "core-js": "^3.6.4",//按需加载js兼容性处理
        "babel": "^6.23.0",
        "babel-loader": "^8.0.6",
        "eslint": "^6.8.0",//只检查自己写的源代码,第三方的库是不用检查的
        "eslint-loader": "^3.0.3",//语法检查
        "eslint-config-airbnb-base": "^14.0.0",
        "eslint-plugin-import": "^2.20.1",
    //html&css&img&other
        "html-webpack-plugin": "^3.2.0",//复制指定HTML文件,自动引入打包输出的所有资源(JS/CSS)
        "html-loader": "^0.5.5",//处理html中img
        "style-loader": "^1.1.3",//处理css
        "css-loader": "^3.4.2",//处理css
        "url-loader": "^3.0.0",//处理图片资源
        "file-loader": "^5.0.2",//打包其他资源
        "mini-css-extract-plugin": "^0.9.0",//提取css单独成文件
        "optimize-css-assets-webpack-plugin": "^5.0.3",//压缩css
        "postcss-loader": "^3.0.0",//css兼容性处理,配置搜索browserslist,用开发环境需设置node环境变量:process.env.NODE_ENV = development
        "postcss-preset-env": "^6.7.0",//css兼容性处理
    //less
        "less": "^3.13.1",//处理less
        "less-loader": "^5.0.0",//处理less
    
      },
      "dependencies": {
        "jquery": "^3.4.1"
      },
      "browserslist": {
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ],
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ]
      },
      "eslintConfig": {
        "extends": "airbnb-base",
        "env": {
          "browser": true
        }
      },
      "sideEffects": [
        "*.css"
      ],
      "description": ""
    }
    
    
    

    基础配置代码webpack.config.js

    /*
      开发环境配置:能让代码运行
        运行项目指令:
          webpack 会将打包结果输出出去
          npx webpack-dev-server 只会在内存中编译打包,没有输出
    */
    
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
    //dll技术 -->webpack.dll.js
    const webpack = require('webpack');
    const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');
    
    
    // 复用loader
    const commonCssLoader = [
      MiniCssExtractPlugin.loader,
      'css-loader',
      {
        // 还需要在package.json中定义browserslist
        loader: 'postcss-loader',
        options: {
          ident: 'postcss',
          plugins: () => [require('postcss-preset-env')()]
        }
      }
    ];
    
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/built.[contenthash:5].js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            // 在package.json中eslintConfig --> airbnb
            test: /.js$/,
            exclude: /node_modules/,
            // 优先执行
            enforce: 'pre',
            loader: 'eslint-loader',
            options: {
              fix: true
            }
          },
          {
          	// 以下loader只会匹配一个
          	// 注意:不能有两个配置处理同一种类型文件
          	oneOf: [
              {
                test: /.css$/,
                use: [...commonCssLoader]
              },
              {
                test: /.less$/,
                use: [...commonCssLoader, 'less-loader']
              },
              /*
                正常来讲,一个文件只能被一个loader处理。
                当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
                  先执行eslint 在执行babel
              */
              {
                test: /.js$/,
                exclude: /node_modules/,
                use: [
                  /* 
                    开启多进程打包。 
                    进程启动大概为600ms,进程通信也有开销。
                    只有工作消耗时间比较长,才需要多进程打包
                  */
                  {
                    loader: 'thread-loader',
                    options: {
                      workers: 2 // 进程2个
                    }
                  },
                  {
                    loader: 'babel-loader',
                    options: {
                      presets: [
                        [
                          '@babel/preset-env',
                          {
                            useBuiltIns: 'usage',
                            corejs: { version: 3 },
                            targets: {
                              chrome: '60',
                              firefox: '50'
                            }
                          }
                        ]
                      ],
                      // 开启babel缓存
                      // 第二次构建时,会读取之前的缓存
                      cacheDirectory: true
                    }
                  }
                ]
              },
              {
                // 处理图片资源
                test: /.(jpg|png|gif)$/,
                loader: 'url-loader',
                options: {
                  limit: 8 * 1024,
                  name: '[hash:10].[ext]',
                  // 关闭es6模块化
                  esModule: false,
                  outputPath: 'imgs'
                }
              },
              {
                // 处理html中img资源
                test: /.html$/,
                loader: 'html-loader'
              },
              {
                // 处理其他资源
                exclude: /.(html|js|css|less|jpg|png|gif)/,
                loader: 'file-loader',
                options: {
                  name: '[hash:10].[ext]',
                  outputPath: 'media'
                }
              }
            ]
          }
        ]
      },
      plugins: [
        new HtmlWebpackPlugin({
          template: './src/index.[contenthash:5].html',
          // 压缩html代码
          minify: {
            // 移除空格
            collapseWhitespace: true,
            // 移除注释
            removeComments: true
          }
        }),
        new MiniCssExtractPlugin({
          filename: 'css/built.css'
        }),
        // 压缩css
        new OptimizeCssAssetsWebpackPlugin(),
        // 告诉webpack哪些库不参与打包,同时使用时的名称也得变~
        new webpack.DllReferencePlugin({
          manifest: resolve(__dirname, 'dll/manifest.json')
        }),
        // 将某个文件打包输出去,并在html中自动引入该资源
        new AddAssetHtmlWebpackPlugin({
          filepath: resolve(__dirname, 'dll/jquery.js')
        })
      ],
      mode: 'development',
      // 生产环境下会自动压缩js代码
      //mode: 'production',
      //externals和dll是相同目的两种方法,externals引入外部路径,dll适合自己打包库
      //externals: {
      //  // 拒绝jQuery被打包进来
      //  jquery: 'jQuery'
      //},
      optimization: {
        splitChunks: {
          chunks: 'all'
        }
      },
      devServer: {
        contentBase: resolve(__dirname, 'build'),
        compress: true,
        port: 3000,
        open: true,
        // 开启HMR功能
        // 当修改了webpack配置,新配置要想生效,必须重新webpack服务
        //hot: true
      }
    };
    

    webpack.dll.js

    /*
      使用dll技术,对某些库(第三方库:jquery、react、vue...)进行单独打包
        当你运行 webpack 时,默认查找 webpack.config.js 配置文件
        需求:需要运行 webpack.dll.js 文件
          --> webpack --config webpack.dll.js
    */
    
    const { resolve } = require('path');
    const webpack = require('webpack');
    
    module.exports = {
      entry: {
        // 最终打包生成的[name] --> jquery
        // ['jquery'] --> 要打包的库是jquery
        jquery: ['jquery'],
      },
      output: {
        filename: '[name].js',
        path: resolve(__dirname, 'dll'),
        library: '[name]_[hash]' // 打包的库里面向外暴露出去的内容叫什么名字
      },
      plugins: [
        // 打包生成一个 manifest.json --> 提供和jquery映射
        new webpack.DllPlugin({
          name: '[name]_[hash]', // 映射库的暴露的内容名称
          path: resolve(__dirname, 'dll/manifest.json') // 输出文件路径
        })
      ],
      mode: 'production'
    };
    
    
  • 相关阅读:
    tushare包使用案例
    Matplotlib模块:绘图和可视化
    pandas使用
    django 表操作
    元数据Meta
    django关系类型字段
    django项目模型字段
    django项目mysite 2
    django安装使用xadmin
    GCC版本中没有GLIBCXX_3.4.15错误
  • 原文地址:https://www.cnblogs.com/AaronNotes/p/14507231.html
Copyright © 2011-2022 走看看