webpack核心概念使用的综合小案例
注:
由于版本更新很快,同样的配置不同版本很可能会出错(这个就很绝望了)
解决思路
- 看文档
- 查看源码接口
- 网上搜索相应错误
环境
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核心概念使用的综合小案例的更多相关文章
- javascript综合小案例,校验用户注册信息提交
完成这个综合小案例,对于html.css.javascript的大部分内容复习快结束了. 这里做一个小案例--要实现的功能,以一张图片的形式给出: 首先,写出提交数据之后进入的页面代码: <!D ...
- 一个ssm综合小案例-商品订单管理----写在前面
学习了这么久,一直都是零零散散的,没有把知识串联起来综合运用一番 比如拦截器,全局异常处理,json 交互,RESTful 等,这些常见技术必须要掌握 接下来呢,我就打算通过这么一个综合案例把这段时间 ...
- webpack核心概念
一.webpack四个核心概念 1.入口[Entry] webpack将创建所有应用程序 依赖关系图表.图表的起点被称之为 入口起点.入口起点告诉webpack从哪里开始,并遵循着依赖关系图表知道打包 ...
- webpack(2)webpack核心概念
前言 本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具.当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph) ...
- 《java入门第一季》之面向对象综合小案例
需求: /* 教练和运动员案例 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 跟乒乓球相关的人员都需要学习英语. 分析,这 ...
- 一个ssm综合小案例-商品订单管理-第二天
准确来说是第二三天,一时兴起,把这个小项目一鼓作气写完了(较大的bug 均已被我手动捉出并 fix )才来写一篇博客. 接上文 第一天配置继续讲解:
- 一个ssm综合小案例-商品订单管理-第一天
项目需求分析: 功能需求:登录,商品列表查询,修改 项目环境及技术栈: 项目构成及环境: 本项目采用 maven 构建 环境要求: IDEA Version: 2017.2.5 Tomcat Vers ...
- webpack安装与核心概念
安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...
- 通过核心概念了解webpack工作机制
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...
随机推荐
- android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词
上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539. 代码地址:https://gith ...
- Python中操作myslq的方法
实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发,请见我的另一篇文章: MySQL-python Windows下EXE安装文件下载 # -*- coding ...
- 7.2 高速缓冲存储器-Cache
高速缓冲存储器:Cache.Cache的功能是提高CPU数据的输入和输出的速率.CPU的速度与主存的速度之间有巨大的差异.主存的存取时间.存取速度要比CPU的速度要慢了很多倍.为了调和它们之间的巨大速 ...
- 百度地图JavaScript API获取用户当前经纬度和详细地理位置,反之通过详细地理位置获取当前经纬度
前言: 前端时间刚好使用了百度地图的js api定位获取用户当前经纬度并获取当前详细位置和通过当前用户详细地理位置换取用户当前经纬度坐标的功能,为了方便下次找起来方便一些自己在这里记录一下,希望也能够 ...
- 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询
详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统).模糊查询 1,创建数据库,我的用户名:root 密码:root,数据库名称:lianwei,表名:login 2,效果 ...
- 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)
被教练勒令做题不能看题解后的第一道新题,自行 yy 了好久终于 AC 了(菜啊)--写博客纪念. 题目: BZOJ1124 分析: 考虑每个人向他要打的人连边.根据题意,所有点都有且只有一条出边.那么 ...
- Android从Camera中获取图片的两种方法
方法一: 此方法会由Camera直接产生照片回传给应用程序,但是返回的是压缩图片,显示不清晰 ? 1 2 3 4 5 6 try { Intent cameraIntent = new In ...
- IOS开发之Swift学习笔记
1.因为存储属性要求初始化,我们可以使用lazy修饰符来延迟初始化.
- Unity学习-鼠标的常用操作(八)
本次主要介绍5个鼠标事件 void OnMouseEnter():鼠标进入 void OnMouseExit():鼠标移出 void OnMouseDown():鼠标点击 void OnMouseUp ...
- Html常用标签及全称
<!-- 块标签 divsion --><div></div> <!--br 换行 break--> <br /> <!--分割 ...