• webpack简单配置单页


    1.新建目录

    1-2.目录结构

     以红框内的目录结构为主  , 这里没有加入.gitignore  .eslintrc.js  .eslintignore 等文件

    package.json内容 

    {
      "name": "webpack-dev",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "build": "webpack",
        "img": "webpack --config webpack.img.js",
        "dev": "webpack-dev-server --config webpack.dev.js",
        "dabao": "webpack --config webpack.prod.js"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "@types/node": "^14.11.5",
        "autoprefixer": "9.8.0",
        "clean-webpack-plugin": "^3.0.0",
        "copy-webpack-plugin": "^6.2.0",
        "css-loader": "^4.3.0",
        "cssnano": "^4.1.10",
        "file-loader": "^6.1.0",
        "glob": "^7.1.6",
        "html-webpack-plugin": "^4.5.0",
        "html-withimg-loader": "^0.1.16",
        "jquery": "^1.11.3",
        "mini-css-extract-plugin": "^0.11.3",
        "postcss-loader": "^4.0.3",
        "postcss-px2rem": "0.3.0",
        "purify-css": "^1.2.5",
        "uglifyjs-webpack-plugin": "^2.2.0",
        "url-loader": "^4.1.0",
        "webpack": "^4.44.2",
        "webpack-dev-server": "^3.11.0",
        "webpack-merge": "^5.2.0",
        "webpack-spritesmith": "^1.1.0",
        "yarn": "^1.22.10"
      },
      "devDependencies": {
        "purgecss-webpack-plugin": "^3.0.0",
        "webpack-cli": "3.3.11"
      }
    }

    npm install  或者  yarn add *    进行安装

    如果有报错 , 那就多装几次

    推荐 yarn  安装 . 速度较快 , 且某些依赖下载比较顺畅 , 不会报错

    文件中 scripts  对执行文件的命名比较随意 , 可以自行更改 
    例如:
    npm run build
    执行 webpack.config.js
    开发环境执行
    npm run dev

    生产雪碧图
    npm run img
    项目打包执行
    npm run dabao


    以下是主要的文件配置

    webpack.config.js 内容

    const path = require("path");
    
    //Html打包插件
    let HtmlWebpackPlugin = require("html-webpack-plugin"); //引入html插件
    let glob = require("glob");
    //css插件
    let PurgecssPlugin = require("purgecss-webpack-plugin"); //清除无用css
    let MiniCssExtractPlugin = require("mini-css-extract-plugin"); // CSS抽离插件
    // 其他插件
    const { CleanWebpackPlugin } = require("clean-webpack-plugin");
    let CopyWebpackPlugin = require("copy-webpack-plugin"); //拷贝插件
    const webpack = require("webpack");
    
    //模块导出
    module.exports = {
      mode: "development",
      entry: path.join(__dirname, "index.js"),
      output: {
        path: path.join(__dirname, "/bundle"),
        filename: "[name].js",
      },
      resolve: {
        //寻找模块规则
        modules: [path.resolve("node_modules")],
        alias: {
          // bootstrap
        },
        extensions: [".ts", ".tsx", ".js", ".css", ".json"],
      },
      // devServer: {
      //   port: 4001,
      //   contentBase: "./bundle",
      //   proxy: {
      //     "/api": {
      //       target: "http://localhost:4001/api",
      //       changeOrigin: true, //解决接口跨域
      //       secure: false, ////https接口需要
      //       pathRewrite: {
      //         "^/api": "",
      //       },
      //     },
      //   },
      // },
      //   watch: true,
      //   watchOptions: {
      //     poll: 1000,
      //     aggregateTimeout: 500,
      //     ignored: /node_modules/,
      //   },
      devtool: "eval-source-map", //映射
      plugins: [
        new HtmlWebpackPlugin({
          template: "./public/index.html",
          filename: "index.html",
        }),
        new webpack.ProvidePlugin({
          $: "jquery",
        }),
        new MiniCssExtractPlugin({
          filename: "css/index.css",
        }),
        new PurgecssPlugin({
          //清除无用css
          paths: glob.sync(`${path.join(__dirname, "/public/*.html")}`, {
            nodir: true,
          }),
        }),
        new CleanWebpackPlugin(),
      ],
      module: {
        rules: [
          {
            test: /.html$/i,
            use: ["html-withimg-loader"],
          },
          // {  //因为在开发环境和生产环境中的资源路径不一 , 所以这里并没有对图片路径做处理 , 所以注释掉了 , 如果两个文件都有对图片处理 , 会报错的
          //   test: /.(png|jpg|gif)$/,
          //   use: [
          //     {
          //       loader: "url-loader",
          //       options: {
          //         limit: 1 * 1024,
          //         outputPath: "./img/",
          //         // publicPath: "https://img.hbhcdn.com/zhuanti/2003469", //资源路径
          //         esModule: false,
          //         name: "[name].[ext]",
          //       },
          //     },
          //   ],
          // },
          {
            test: /.css$/,
            use: [
              {
                loader: MiniCssExtractPlugin.loader,
                options: {
                  publicPath: "../", //  在文件路径前加上  './'
                },
              },
              "css-loader",
              "postcss-loader",
            ],
          },
        ],
      },
    };

    所有打包执行以  webpack.config.js   为主 ,

    webpack.dev.js文件内容

    let { merge } = require("webpack-merge");
    let MiniCssExtractPlugin = require("mini-css-extract-plugin"); // CSS抽离插件
    let base = require("./webpack.config.js");
    module.exports = merge(base, {
      mode: "development", //开发环境
      devtool: "source-map",
      devServer: {  
        port: 4001,
        contentBase: "./bundle",
        open: true,
        hot: true,
        proxy: {
          "/api": {
            target: "http://localhost:4001/api",
            changeOrigin: true, //解决接口跨域
            secure: false, ////https接口需要
            pathRewrite: {
              "^/api": "",
            },
          },
        },
      },
      module: {
        rules: [
          {
            test: /.(png|jpg|gif)$/,
            use: [
              {
                loader: "url-loader",
                options: {
                  limit: 1 * 1024,
                  outputPath: "./img/",
                  //   publicPath: "https://img.hbhcdn.com/zhuanti/2003469", //资源路径
                  esModule: false,
                  name: "[name].[ext]",
                },
              },
            ],
          },
        ],
      },
    });

    这里对资源路径和跨域进行处理

    webpack.img.js 内容

    //生成雪碧图
    var path = require("path");
    const SpritesmithPlugin = require("webpack-spritesmith"); //雪碧图
    module.exports = {
        mode: "production",
        entry: path.join(__dirname, "sprite.js"),
        plugins: [
            new SpritesmithPlugin({
                src: {
                    cwd: path.resolve(__dirname, "./public/icon"),
                    glob: "*.png",
                },
                target: {
                    image: path.resolve(__dirname, "./public/images/sprite.png"),
                    css: path.resolve(__dirname, "./public/css/sprite.css"),
                },
                apiOptions: {
                    cssImageRef: "../images/sprite.png",
                },
            }),
        ],
        module: {
            rules: [{
                test: /.png$/,
                use: ["file-loader?name=i/[hash].[ext]"],
            }, ],
        },
        resolve: {
            modules: ["node_modules", "spritesmith-generated"],
        },
    };

    制作雪碧图

    webpack.prod.js 内容  

    let {
      merge
    } = require("webpack-merge");
    let MiniCssExtractPlugin = require("mini-css-extract-plugin"); // CSS抽离插件
    let base = require("./webpack.config.js");
    module.exports = merge(base, {
      mode: "production", //生产环境
      devtool:false,  
     module: { rules: [{ test:
    /.(png|jpg|gif)$/, use: [{ loader: "url-loader", options: { limit: 1 * 1024, outputPath: "./img/", publicPath: "https://img.hbhcdn.com/zhuanti/2005155", //资源路径 esModule: false, name: "[name].[ext]", }, }, ], }, ], }, });

    这块比较随意  应该是将beta地址改为 线上地址 , 并打包压缩代码 并设置devtool 为false , 防止线上代码被直接查看

    以下是入口文件

    因为在webpack.config.js 中将根目录下的  index.js 设为 入口文件所以 ,需要通过es6中的 import 引入对应文件

    html文件因为有插件进行打包处理 , 所以不用再这引入

    new HtmlWebpackPlugin({
          template: "./public/index.html",
          filename: "index.html",
        }),

    index.js内容

    import './public/js/index'
    import './public/js/px-rem-index'
    import "./public/css/sprite.css"
    import './public/css/index.css'

    webpack.img.js 中 将sprite.js  作为入口文件

    sprite.js 里啥也没有 , 只是单单因为必须要有入口文件才能正常打包, 所以强加上的一个文件

    其他依赖配置文件

    postcss.config.js 内容

    module.exports = {
      plugins: [require("autoprefixer"), require('postcss-px2rem')({
        remUnit: 50,
        remPrecision: 2
      })], //配置插件  给css加前缀
    };

    为css依赖中注入插件,这里是为css添加前缀和rem转换  

    只是这还不够

    .browserslistrc文件内容

    > 1%
    last 7 versions,
    not ie <= 8,
    ios >= 8,
    android >= 4.0

    为css前缀加入兼容规则

    以下是记录下此前写法 :

     之前可以这么玩 ,插件直接写在plugins里 , 很郁闷 ,现在这么写会报错 , 好像有没有plugins这个API了 , 猜想应该是版本更新导致的

    {
                    test: /.css$/,
                    use: [{
                            loader: MiniCssExtractPlugin.loader, //将解析的css抽离为main.css文件
                            options: {
                                publicPath: '../' //这个option必须写,否则css中图片路径可能会出错
                            }
                        },
                        'css-loader', //必须在'css-loader'下面,添加css前缀,配置同级目录下的postcss.config.js文件,进行配置
                        // 'postcss-loader',
                        {
                            loader: 'postcss-loader',
                            options: {
                                plugins: [
                                    require('autoprefixer'),
                                    //require('cssnano'),<= 需去掉,因为会去掉注释
                                    require('postcss-px2rem')({
                                        remUnit: 50,
                                        remPrecision: 2 //精确到多少为小数点后位
                                    })
                                ],
                            }
                        }
                    ]
                },

    最后的最后 , 简简单单的webpack单页就配置完了  

  • 相关阅读:
    html5快速入门(四)—— JavaScript
    SJPullDownMenu下拉菜单框架使用
    HTML5快速入门(三)—— 标签综合运用
    html5快速入门(二)—— CSS简介
    html5快速入门(一)—— html简介
    Robotium测试套管理测试用例
    从GitHub远程仓库中删除文件夹或文件
    上传本地代码到GitHub
    Jenkins关联GitHub进行构建
    Jenkins忘记用户名密码
  • 原文地址:https://www.cnblogs.com/wxyblog/p/13781673.html
Copyright © 2020-2023  润新知