注:

由于版本更新很快,同样的配置不同版本很可能会出错(这个就很绝望了)

解决思路

  1. 看文档
  2. 查看源码接口
  3. 网上搜索相应错误

环境

webpack4.x + yarn

文件结构

.
├── dist //打包输出目录
├── package.json
├── postcss.config.js
├── rules_config //module 中各种文件到导入处理
│   ├── babel-polyfill.js
│   ├── babel-runtime.js
│   ├── css.js
│   ├── font.js
│   ├── images.js
│   └── less.js
├── src
│   ├── fonts
│   │   ├── iconfont.css
│   │   ├── iconfont.eot
│   │   ├── iconfont.svg
│   │   ├── iconfont.ttf
│   │   ├── iconfont.woff
│   │   └── iconfont.woff2
│   ├── images
│   │   ├── 1.png
│   │   └── 2.png
│   ├── js
│   │   ├── app.js
│   │   └── math.js
│   └── sheet
│       ├── css.css
│       └── less.less
├── view
│   └── index.html
├── webpack.config.build.js
├── webpack.config.bundle.js
├── webpack.config.serve.js
└── yarn.lock

package.json

{
  "name": "sample",
  "version": "1.0.0",
  "private": true,
  "license": "MIT",
  "scripts": {
    "bundle": "webpack --config webpack.config.bundle.js",
    "serve": "webpack-dev-server --config webpack.config.serve.js",
    "build": "webpack --config webpack.config.build.js"
  },
  "devDependencies": {
    "@babel/core": "^7.4.5",
    "@babel/plugin-transform-runtime": "^7.4.4",
    "@babel/polyfill": "^7.4.4",
    "@babel/preset-env": "^7.4.5",
    "@babel/runtime": "^7.4.5",
    "@babel/runtime-corejs2": "^7.4.5",
    "autoprefixer": "^9.6.0",
    "babel-loader": "^8.0.6",
    "clean-webpack-plugin": "^3.0.0",
    "css-loader": "^2.1.1",
    "file-loader": "^4.0.0",
    "html-webpack-plugin": "^3.2.0",
    "less": "^3.9.0",
    "less-loader": "^5.0.0",
    "postcss-loader": "^3.0.0",
    "style-loader": "^0.23.1",
    "url-loader": "^2.0.0",
    "webpack": "^4.33.0",
    "webpack-cli": "^3.3.3",
    "webpack-dev-server": "^3.7.1"
  },
  "browserslist": [
    "last 2 versions"
  ]
}

可用的命令

  • yarn build //打包生产环境的代码
  • yarn serve //运行本地服务器
  • yarn bundle //打包开发环境的代码(未压缩)
  • yarn add -D [pagckage-name] //添加开发依赖包
  • yarn install  [pagckage-name] //安装包

打包配置文件

webpack.config.bundle.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');

module.exports = {
    entry: {
        app: './src/js/app.js' //入口js文件
    },
    output: {
        filename: "[hash:8]--[name].js", //输出的js文件名
        path: path.resolve(__dirname, 'dist'), //输出目录(必须是绝对路径)
        // publicPath: "https://192.168.1.106:6655" //用于CDN
    },
    mode: "development", //开发环境
    devtool: "cheap-module-eval-source-map",
    module: {
        rules: [
            require('./rules_config/css.js'),
            require('./rules_config/less.js'),
            require('./rules_config/images.js'),
            require('./rules_config/font.js'),
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loader: "babel-loader",
                options: require('./rules_config/babel-polyfill.js'),
                // options: require('./rules_config/babel-runtime.js'),
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({ //生成模版html,自动注入打包的js文件
            template: './view/index.html'
        }),
        new CleanWebpackPlugin(), //清除dist目录的内容
    ],
    stats: {children: false} //避免 Entrypoint undefined = index.html
};
webpack.config.serve.js
const md = require('./webpack.config.bundle.js');
const path = require('path');
const serve = {
    devServer: {
        contentBase: path.resolve(__dirname, 'dist'),
        port: 12986,
        hot: true,
        hotOnly: true,
        open: true
    }
};
Object.assign(md, serve);
const webpack = require('webpack');
md.plugins.push(new webpack.HotModuleReplacementPlugin());
module.exports = md;
webpack.config.build.js
const md = require('./webpack.config.bundle.js');
const build = {
    mode: "production", //用于线上(生成环境)
    devtool: "cheap-module-source-map",
};
Object.assign(md, build);
module.exports = md;
处理各种文件(loader)的配置
css 文件
module.exports = {
    test: /.css$/,
    use: [
        'style-loader',
        {
            loader: "css-loader",
            options: {
                importLoaders: 1
            }
        },
        'postcss-loader'
    ]
};

less 文件
module.exports = {
    test: /\.less$/,
    use: [
        'style-loader',
        {
            loader: "css-loader",
            options: {
                modules: true,
                importLoaders: 2
            }
        },
        'less-loader',
        "postcss-loader"
    ]
};

js 文件,主要出es6转es5
全局替换,用于应用
module.exports = {
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "edge": "17",
                    "firefox": "60",
                    "chrome": "67",
                    "safari": "11.1",
                    "ie": "9"
                },
                "useBuiltIns": "usage", //按需引入
                "corejs": "2",
            }
        ]
    ],
};

局部替换,用于框架/库
module.exports = {
    "plugins": [
        [
            "@babel/plugin-transform-runtime",
            {
                "absoluteRuntime": false,
                "corejs": 2,
                "helpers": true,
                "regenerator": true,
                "useESModules": false
            }
        ]
    ]
};

font 文件
module.exports = {
    test: /\.(eot|svg|ttf|woff|woff2)$/,
    loader: "file-loader",
    options: {
        name: '[hash:8]--[name].[ext]',
    }
};

图片文件
module.exports = {
    test: /\.(png|jpg|gif)$/,
    loader: "url-loader",
    options: {
        name: '[hash:8]--[name].[ext]',
        outputPath: 'images', //输出目录中的images的目录下
        limit: 8 * 1024, //小于8K 转成 base64字符串
    }
};

样式相关的文件

/src/sheet/css.css
*{
    padding: 0;
    margin: 0;
}
.at{
    transform: translate(30px, 30px);
    color: red;
}
/src/sheet/less.less
.lt{
  transform: translate(unit(100, px), unit(100, px));
  color: chocolate;
}
postcss.config.js //用于使用 postcss-loader
module.exports = {
    plugins: [
        require('autoprefixer')
    ],
};

/view/index.html 模版文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 class="hmr">
    1111111
</h1>
<div style="font-size: 100px; background: coral">
    <i class="iconfont icon-icon-test"></i>
    <i class="iconfont icon-icon-test1"></i>
    <i class="iconfont icon-icon-test2"></i>
</div>
<div id="img1" style="width: 100px; height: 150px; overflow: hidden"></div>
<div id="img2"></div>

<h1 class="at">全局的</h1>
<h1 class="lt">模块化样式测试1(局部样式,代码中添加)</h1>
<div style="height: 200px"></div>
<h1 class="lt">模块化样式测试2(没有在代码中添加类)</h1>
</body>
</html>

测试使用的代码 /src/js/app.js

// 全局样式
import '../sheet/css.css';
import '../fonts/iconfont.css';

// 样式模块化测试
import less from '../sheet/less.less';

window.document.querySelector('.lt').classList.add(less.lt);

// 图片测试 > 8 K
let img = new Image();
img.src = require('../images/1.png');
window.document.querySelector('#img1').appendChild(img);

// 图片测试 < 8 K
img = new Image();
img.src = require('../images/2.png');
window.document.querySelector('#img2').appendChild(img);

// es6 语法,按需加载
const es6m = (a, b)=>{
    return new Promise(resolve => {
        resolve(a + b);
    });
};
(async function () {
    const ret = await es6m('afn111', 'b11');
    console.log(ret);
})();

// 普通的js导入测试11
import './math.js';
// HMR
if(module.hot){
    module.hot.accept(['./math.js'], function () {
        console.log('213')
    });
}

font文件夹中的内容

阿里巴巴矢量图标库  https://www.iconfont.cn/ 中下载的压缩包中的字体文件

webpack核心概念使用的综合小案例的更多相关文章

  1. javascript综合小案例,校验用户注册信息提交

    完成这个综合小案例,对于html.css.javascript的大部分内容复习快结束了. 这里做一个小案例--要实现的功能,以一张图片的形式给出: 首先,写出提交数据之后进入的页面代码: <!D ...

  2. 一个ssm综合小案例-商品订单管理----写在前面

    学习了这么久,一直都是零零散散的,没有把知识串联起来综合运用一番 比如拦截器,全局异常处理,json 交互,RESTful 等,这些常见技术必须要掌握 接下来呢,我就打算通过这么一个综合案例把这段时间 ...

  3. webpack核心概念

    一.webpack四个核心概念 1.入口[Entry] webpack将创建所有应用程序 依赖关系图表.图表的起点被称之为 入口起点.入口起点告诉webpack从哪里开始,并遵循着依赖关系图表知道打包 ...

  4. webpack(2)webpack核心概念

    前言   本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具.当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph) ...

  5. 《java入门第一季》之面向对象综合小案例

    需求: /*     教练和运动员案例         乒乓球运动员和篮球运动员.         乒乓球教练和篮球教练.         跟乒乓球相关的人员都需要学习英语.         分析,这 ...

  6. 一个ssm综合小案例-商品订单管理-第二天

    准确来说是第二三天,一时兴起,把这个小项目一鼓作气写完了(较大的bug 均已被我手动捉出并 fix )才来写一篇博客. 接上文 第一天配置继续讲解:

  7. 一个ssm综合小案例-商品订单管理-第一天

    项目需求分析: 功能需求:登录,商品列表查询,修改 项目环境及技术栈: 项目构成及环境: 本项目采用 maven 构建 环境要求: IDEA Version: 2017.2.5 Tomcat Vers ...

  8. webpack安装与核心概念

    安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...

  9. 通过核心概念了解webpack工作机制

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...

随机推荐

  1. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  2. LeetCode 500. Keyboard Row (键盘行)

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...

  3. Linux下一款可以使用命令行的pdf阅读器

    Zathura是linux下一款用命令行控制打pdf阅读器,并且基本打使用方法和vim很相似.对于喜欢键盘操作的用户来说的确是一个不错的选择. ubuntu下的安装命令: sudo apt-get i ...

  4. centos命令行安装mysql随机密码查看方法(遇到问题及其解决办法)

    mysql初次命令行安装登录时报错: 未输入密码:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwo ...

  5. jQuery 插件开发全解析

    jQuery插件的开发包含两种: 一种是类级别的插件开发,即给jQuery加入新的全局函数,相当于给jQuery类本身加入方法.jQuery 的全局函数就是属于jQuery命名空间的函数,还有一种是对 ...

  6. 【bzoj1015】[JSOI2008]星球大战starwar

    给定一个无向图,求联通块个数,以及k次每次摧毁一个点后的联通块个数 将边和摧毁的点全记录下来,反着做即可 注意被摧毁的点不能算作联通块 #include<algorithm> #inclu ...

  7. ios14--购物车优化2

    // // ViewController.m // 03-综合练习 // // Created by xiaomage on 15/12/28. // Copyright © 2015年 小码哥. A ...

  8. ROADS - Roads

    N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters a ...

  9. imagebutton 设置点击和按压效果

    实现 点击 时 有按压效果 更换颜色 <ImageButton android:id="@+id/mediacontroller_Fullscreen_or_not" and ...

  10. iframe高度100%,自适应高度

    声明:有更好的方法在下一篇内容中 100% http://www.360doc.com/content/11/1102/15/55892_161105115.shtml iframe自适应高度 转自: ...