环境

win10 + webstorm 2019.1.3 + node 12.x + yarn

实现的的功能

  1. 基本的js打包(支持规范:ES6 module | requirejs | commonjs)
  2. 打包样式css、less,样式的模块化 ,增加样式的厂商前缀
  3. 打包字体
  4. 打包图片(小于8K的转base64字符串)
  5. 自动注入打包后的js文件
  6. 自动清理打包目录(只留下最后一次成功打包的文件)

文件结构

.
├── bulid-webpack.config.js //生成模式配置
├── dev-webpack.config.js //开发模式配置
├── dist //打包后的目录
│   ├── 07d95431--app.js
│   ├── 07d95431--app.js.map
│   ├── 524c08db--iconfont.eot
│   ├── a8ed3992--iconfont.woff
│   ├── c4b92501--iconfont.svg
│   ├── f4a753e6--iconfont.ttf
│   ├── images
│   │   └── 83ac0039--1.png
│   └── index.html
├── package.json
├── postcss.config.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 //
└── yarn.lock //

package.json

{
  "name": "sample",
  "version": "1.0.0",
  "private": true,
  "license": "MIT",
  "scripts": {
    "dev": "webpack --config dev-webpack.config.js",
    "build": "webpack --config bulid-webpack.config.js"
  },
  "devDependencies": {
    "autoprefixer": "^9.6.0",
    "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"
  },
  "browserslist": [ //支持的浏览器,主流浏览器最后2个版本,用于样式添加厂商前缀
    "last 2 versions"
  ]
}

webapck.config

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

module.exports = {
    entry: {
        app: './src/js/app.js'
    },
    output: {
        filename: "[hash:8]--[name].js",
        path: path.resolve(__dirname, 'dist'),
        // publicPath: "https://192.168.1.106:6655" //用于CND之类
    },
    mode: "development",
    devtool: "cheap-module-eval-source-map",
    module: {
        rules: [
            {
                test: /.css$/,
                use: [
                    'style-loader',
                    {
                        loader: "css-loader",
                        options: {
                            importLoaders: 1
                        }
                    },
                    'postcss-loader'
                ]
            },
            {
                test: /\.less$/,
                use: [
                    'style-loader',
                    {
                        loader: "css-loader",
                        options: {
                            modules: true,
                            importLoaders: 2
                        }
                    },
                    'less-loader',
                    "postcss-loader",
                ]
            },
            {
                test: /\.(png|jpg|gif)$/,
                use: {
                    loader: "url-loader",
                    options: {
                        name: '[hash:8]--[name].[ext]',
                        outputPath: 'images',
                        limit: 8 * 1024,
                    }
                }
            },
            {
                test: /\.(eot|svg|ttf|woff|woff2)$/,
                use: {
                    loader: "file-loader",
                    options: {
                        name: '[hash:8]--[name].[ext]',
                    }
                }
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({ //拷贝到输出目录,并注入打包后的js文件
            template: "./view/index.html"
        }),
        new CleanWebpackPlugin(), //清除输出目录中的文件
    ]
};
bulid-webpack.config.js   (yarn build)
const md = require('./dev-webpack.config.js');
const build = { //不一样的就这两个部分
    mode: "production",
    devtool: "cheap-module-source-map",
};
Object.assign(md, build);
module.exports = md;

postcss.config.js

module.exports = {
    plugins: [
        require('autoprefixer') //使用插件autoprefixer, 用于增加厂商前缀
    ],
};

view 下的 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<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>

样式

css
*{
    padding: 0;
    margin: 0;
}
.at{
    transform: translate(100px, 100px);
    color: aqua;
}
less
.lt{
  transform: translate(unit(100, px), unit(100, px));
  color: chocolate;
}

js

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

// 普通的js导入测试
import math from './math.js';

console.log('add(11, 11): ', math.add(11, 11));
console.log('mul(11, 11): ', math.mul(11, 11));
console.log('sub(110, 11): ', math.sub(110, 11));

// 样式模块化测试
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);
math.js
export default {
    sub: function (a, b) {
        return a - b;
    },
    add: function (a, b) {
        return a + b;
    },
    mul: function (a, b) {
        return a * b;
    }
}

fonts目录: Iconfont-阿里巴巴矢量图标库 (https://www.iconfont.cn/)上下载的文件

dist 目录:打包后的文件结构

注:yarn dev 和 yarn build 打包后的文件有点不同(后者有.map文件)

demo_static_resrouce的更多相关文章

随机推荐

  1. 2014年辛星starphp第一节设置入口文件以及App类

    *********************本节目标**************** 1.首先是我们的框架大致布局,我们即将写成的这个框架.它的入口文件统一为star.php.它须要做的一些事,比方载入 ...

  2. Android面试题1

    1.Android中intent的是? 答:实现界面间的切换,能够包括动作和动作数据.连接四大组件的纽带. 2.SAX解析xml文件的长处的是? 答:不用事先调入整个文档,占用资源少 3.在andro ...

  3. automaticallyAdjustsScrollViewInsets 使用

    automaticallyAdjustsScrollViewInsets(个人认为iOS7中略坑爹的属性) @当我们在一个UIViewController中同时创建2个tableView的时候,如果把 ...

  4. AD、DNS、DHCP、IIS、WINS的形象定义及关系

    AD-实际是就是一个包括所有信息的数据库,和现实生活中就将其比作派出所,所有的信息都要进入他那的数据库当中(包括人员姓名(计算机名.账号.密码等) DNS就是建立起关联起好记忆的名称,比如你家的位置用 ...

  5. ajax异步文件上传和进度条

    一.ajax异步文件上传 之前有说过在form表单内的文件上传,但是会刷新页面,下面就来实现不刷新页面的异步文件上传 <div class="uploding_div"> ...

  6. java异步编程

    异步编程提供了一个非阻塞事件驱动的模型.通过异步消除阻塞,可以让web服务响应更多请求.可以让系统更高效的执行.比如log框架,记录日志或异常时异步执行可避免影响正常业务流程的执行. 异步变成如何把线 ...

  7. jqxtree异步加载部门树

    整体思路 A.要想实现异步加载第一次加载的是一级部门 B.加载一级部门,如果有子部门,部门前面带+号,没有子部门,部门前面没有+号(+号也就是点击可以展开) C.在sql中实现如果有子部门默认都加载一 ...

  8. bzoj1433[ZJOI2009]假期的宿舍(匈牙利)

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2544  Solved: 1074 [Submit][St ...

  9. asp.net core 2.0 Json结果的格式

    asp.net core 2.0 默认返回的结果格式是Json, 并使用json.net对结果默认做了camel case的转化(大概可理解为首字母小写). 这一点与老.net web api 不一样 ...

  10. HTML--form表单中的label标签

    小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...