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 ...
随机推荐
- ORA-01925:maximum of 80 enabled roles exceeded
ORA-01925:maximum of 80 enabled roles exceeded max_enabled_roles 9i的參数,10g及以后都不用了. 指定用户session的最大ena ...
- leetcode笔记:Wiggle Sort
一. 题目描写叙述 Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nu ...
- 【Codevs1288】埃及分数
Position: http://codevs.cn/problem/1288/ Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/ ...
- bzoj2780
AC自动机+树链剖分+线段树/树状数组+dfs序+树链的并 题意:给出n个母串和q个询问串,对于每个询问串输出有多少个母串包含这个询问串 N=∑|母串|<=10^5 Q=∑|询问串|<=3 ...
- oracle更新大量数据太慢,可以通过游标实现的例子
declare cursor city_cur isselect t.new_customer_id,t.old_customer_id from citsonline.crm_customer_tm ...
- PCB 利用nginx正向代理实现上网
在PCB行业中,为了保证服务器的安全性,服务器正常都是需要与外网断开的,如果想在服务器通过浏览器下载一点东西是不行.通常作法是在一台可以上网的电脑下载文件,接着放到网络盘上,再从网络盘拷贝到服务器上. ...
- bzoj1088扫雷(搜索)
1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3669 Solved: 2153[Submit][St ...
- P4407 [JSOI2009]电子字典
传送门 我的哈希打挂了--然而大佬似乎用哈希可以过还跑得很快-- 删除,枚举删哪个字符,记删之后的哈希值存map 插入,相当于在单词里删字符,去对应的map里查找 更改,相当于两个都删掉同一个位置的字 ...
- [Swift通天遁地]二、表格表单-(3)在表格中嵌套另一个表格并使Cell的高度自适应
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]二、表格表单-(6)创建美观的表格弹性下拉刷新效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...