webpack 打包 todolist 应用
写在前面的话:
一直想着手动配置webpack实现应用,正好最近这段时间比较空闲,就写了一个通过webpack打包实现todolist的简单应用。本文内容包括:通过webpack打包css,html,js文件处理,以及图片处理。以下是配置文件内容,如果你都能看懂,那本文对你可能收效甚微。如有不解之处,敬请细看。
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const miniCssExtractPlugin = require('mini-css-extract-plugin') module.exports = {
mode: 'development',
entry: './src/js/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[hash:8].js'
},
module: {
rules: [{
test: /(\.jsx|\.js)$/,
use: {
loader: "babel-loader"
},
exclude: /node_modules/
},
{
test: /\.css$/,
use: ['style-loader', {
loader: miniCssExtractPlugin.loader
}, 'css-loader']
},
{
test: /\.html$/,
use: [{
loader: 'html-withimg-loader'
}]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 1,
outputPath: 'imgs/'
},
}]
},
]
},
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: false,
port: 3000
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html',
}),
new miniCssExtractPlugin({
filename: 'css/[name].css'
})
]
}
一、什么是webpack?
这里引用webpack官网定义:webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。通俗讲就是将资源进行重新整合。
webpack有四个核心概念:
- entry (用于配置入口)
- output (用于配置输入文件)
- loader(用于对模块的源代码进行转换处理)
- plugins(插件,webpack功能扩展,使得webpack无比强悍)
二、本文主要内容
1. 首先创建项目目录
初始化: yarn init //安装 webpack (尽量不要安装为全局依赖)
安装依赖: yarn add webpack wabpack-cli -D 然后创建相应的项目目录结构。 例:
2. 接着在 webpack.config.js 中进行配置
在 package.json 文件中配置运行脚本
"scripts": {
"build": "webpack"
},
配置后直接执行 yarn build 即可 如果没有配置则执行 npx webpack 命令 1. 打包js文件
const path = require('path')
module.exports = {
// 入口文件
entry: './src/js/main.js',
// 输出文件
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[hash:8].js'
},
// module: {},
// plugins: [],
// devServer: {}
} 2. 如何打包 html文件
我们需要安装一个插件
yarn add html-webpack-plugin -D // 引入
const HtmlWebpackPlugin = require('html-webpack-plugin') // 在配置中添加
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html',
})
] 即可在 dist 目录下生成相应的js 及html文件 3. 处理css文件
(1)如果是在html文件中直接引入了css文件则只需要执行 yarn add css-loader style-loader -D 安装相应loader
module: {
rules: [
{test: /\.css$/, use: ['style-loader', 'css-loader']}
]
}
(2)如果在想实现自动引入css文件则需要要安装插件 yarn add mini-css-extract-plugin
// 在plugins中添加如下代码
new miniCssExtractPlugin({
filename: 'css/[name].css'
})
// 将css中的loader 配置修改为
{test: /\.css$/, use: ['style-loader', {loader: miniCssExtractPlugin.loader}, 'css-loader']}
4、js文件处理 (将es6、7、8转换为es5,解决浏览器兼容问题)
安装babel-loader yarn add babel-loader @babel/core -D
{
test: /(\.jsx|\.js)$/,use: {loader: "babel-loader"},
//排除node_modules文件夹中的js文件
exclude: /node_modules/
}
5、图片处理
[1]在css文件中使用背景图片时不需要任何配置 [2]在js中创建图片时 安装 file-loader 或者 url-loader
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: [{
loader: 'url-loader',
options: {
limit: 1, // 图片小于多少时输出为base64格式
outputPath: 'imgs/' // 图片输出位置
},
}]}
[3] 在html 中使用img标签引入图片 则需要安装 html-withimg-loader
{
test: /\.html$/,
use: ['html-withimg-loader']
}
6、启动服务配置
安装 webpack-dev-server 并添加相应配置
devServer: {
contentBase: path.join(__dirname, 'dist'),
compress: false,
port: 3000
}
如上配置即可在 3000端口启动服务,可以通过localhost:3000访问
在package.json中添加运行脚本
"scripts": {
"dev": "webpack-dev-server",
"build": "webpack"
}
运行 yarn run dev 或执行 yarn run build 打包
三、附上完整代码
复制下面代码或点击该链接下载源码: https://github.com/moor-mupan/todoList.git
<-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>webpack进阶</title>
</head>
<body>
<div class="bigbox">
<div class="out-box">
<div class="item-tit">
<h1 class="title">TODOLIST 代办事项</h1>
<div class="flex">
<input id="addInput" class="input" type="text" placeholder="输入代办">
<button id="add" type="button" class="btn">添加代办</button>
</div>
</div>
<div class="item-box">
<h2>代办事项</h2>
<ul id="todo"></ul>
</div>
<div class="item-box">
<h2>已完成</h2>
<ul id="done"></ul>
</div>
<div class="img-box"></div>
</div>
<img src="./src/imgs/time.png" class="tipImg">
</div>
<div class="module" id="module">
<div id="toNotDo">添加到待办</div>
<div id="toDone">添加到已完成</div>
<div id="del">删除</div>
<div id="close">关闭</div>
</div>
</body>
</html>
// src/js/main.js
import '../css/main.css' let $ = require('jquery')
$(() => {
const $add = $('#add')
const $addInput = $('#addInput')
const $todo = $('#todo')
const $done = $('#done')
const $module = $('#module')
const $close = $('#close')
const $del = $('#del')
const $toDone = $('#toDone')
const $toNotDo = $('#toNotDo')
let itemID = ''
let cur = ''
let nowID = '' $add.click(() => {
let val = $addInput.val()
if (val.trim() !== '') {
itemID = guid()
let dom = `<li id=${itemID}>${val}</li>`
$todo.append(dom)
$addInput.val('')
todoHandle()
} else {
alert('输入代办内容')
}
})
$toDone.click(() => {
$done.append(cur)
$('#todo>li').remove(`#${nowID}`)
close()
})
$toNotDo.click(() => {
$todo.append(cur)
$('#done>li').remove(`#${nowID}`)
close()
})
$del.click(() => {
$('#done>li').remove(`#${nowID}`)
$('#todo>li').remove(`#${nowID}`)
close()
})
$close.click(() => {
close()
}) function todoHandle() {
let $li = $('li')
let clientX = 0
let clientY = 0 $li.bind("contextmenu", function(e) {
cur = e.currentTarget
nowID = $(cur).attr('id') clientX = e.clientX
clientY = e.clientY
$module.css({
display: 'inline-block',
left: `${clientX}px`,
top: `${clientY}px`
})
return false
})
} function close() {
$module.css({
display: 'none'
})
} function guid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
})
/* src/css/main.css */
body{
background-color: #39CCCC;
} *{
box-sizing: border-box;
} .bigbox{
display: flex;
align-items: flex-start;
justify-content: center;
} .out-box{
display: inline-block;
width: 640px;
padding: 30px;
} .flex{
display: flex;
align-items: center;
} .input {
height: 30px;
line-height: 30px;
line-height: 30px;
border: 1px solid #EEEEEE;
border-radius: 6px 0 0 6px;
padding: 0 20px;
} .btn{
height: 30px;
border: 1px solid #001F3F;
background-color: #004444;
color: #fff;
border-radius: 0 6px 6px 0;
} .item-box{
line-height: 40px;
margin-bottom: 10px;
} .item-box li{
width: 360px;
background-color: #004444;
color: #fff;
list-style: none;
padding: 0 20px;
border-bottom: 1px solid #FFFF00;
} .item-box li:last-of-type{
border: none;
} .item-box li:hover{
color: #FFFF00;
cursor: pointer;
} .module{
/* display: inline-block; */
border-radius: 6px;
background-color: #fff;
line-height: 30px;
position: absolute;
display: none;
} .module div{
padding: 0 30px;
} .module div:hover{
background-color: #ddd;
cursor: pointer;
} .tipImg{
border-radius: 6px;
}
最终效果图如下:
webpack 打包 todolist 应用的更多相关文章
- 使用webpack打包ThinkPHP的资源文件
使用webpack打包ThinkPHP的资源文件 利用自己的空余时间一直在维护http://www.wx2share.com这个小网站,全是一个人在弄,由于只租得起虚拟空间,所以后台采用了简单方便的T ...
- 【原】使用webpack打包的后,公共请求路径的配置问题
在我们公司,和后台接接口时,公共的请求路径我们是单独抽出来的,放在一个独立的public.js中,在public.js中存入那个公共变量 公共变量是这样 在其他地方使用ajax时,我们就这样使用 这种 ...
- Webpack打包进阶
说在前面 由于使用了React直出,页面各项性能指标使人悦目.本篇将深入探讨目前PC部落所采用webpack打包优化策略,以及探讨PC部落并未使用的 webpack Code Splitting 代码 ...
- webpack打包avalon
webpack打包avalon+oniui+jquery 随着avalon的发展壮大,我根据CSDN的统计数字,中国前端大概有1%的人在使用avalon了. avalon的最大优势是能兼容IE6,并且 ...
- 基于ES6模块标准通过webpack打包HTM5项目
本篇主要演示通过webpack打包phaser项目,webpack安装方法在此处就不一一赘述了 经常用phaser来写html5游戏的朋友可能会发现,当游戏场景比较多时,如果都写在一个js文件中那么将 ...
- webpack 打包成功,但是css不起作用
问题: webpack 打包成功,但是css不起作用 问题分析/解决: 原因有以下几种 使用了webpack2的语法规则不正确; webpack2要求必须写-loader; 可能是只写了css-loa ...
- 14.如何解决使用webpack打包之后,font-awsome路径不对的问题,终极解决方法
问题描述: 使用webpack打包vue项目,使用font-awsome字体,发现打包之后,font-awsome图标不显示,报错为路径不对 看了下打包的路径,的确路径不对,打包之后font-awso ...
- webpack学习--创建一个webpack打包流程
创建一个webpack打包流程 首先安装webpack插件 mkdir webpack-demo && cd webpack-demo npm init -y npm install ...
- Webpack 打包之体积优化
谈及如今欣欣向荣的前端圈,不仅有各类框架百花齐放,如Vue, React, Angular等等,就打包工具而言,发展也是如火如荼,百家争鸣:从早期的王者Browserify, Grunt,到后来赢得宝 ...
随机推荐
- Thinkphp5.0 仿百度糯米 开发多商家 电商平台(完整版)
目录第1章 课程简介第2章 需求分析第3章 快速掌握thinkphp5第4章 任性的TP5模块第5章 生活服务分类管理模块第6章 百度地图应用封装第7章 打造属于TP5自己的发送邮件服务第8章 商户模 ...
- @Transient的用法和格式化页面展示的数据格式
一.Hibernate中:@Transient用法 用法1:使用@Transient这个注解添加表中不存在字段.将这个注解添加到自定义字段的get方法上 用法2:将该注解添加到定义该字段的头部即可,例 ...
- Oracle 查询真实执行计划
什么是真实执行计划 获取Oracle的执行计划,有几种方式.(本文使用Oracle 11g XE版本,以及普通用户scott登录) explain plan for 有两个步骤: explain pl ...
- 使用apache的poi来实现数据导出到excel的功能——方式二
此次,介绍利用poi与layui table结合导出excel.这次不需要从数据库中查询出来的数据进行每一行的拼接那么麻烦,我们这次将标题定义一个id值,对应从数据库中查找出来的字段名即可. 1.po ...
- linux 的vi/vim消除查找到的高亮字符串
方法如下: 在Vi里面如果要搜索某个关键字,只要键入/xxx就可以了,比如,要搜索一个函数,就键入/snprintf 然后回车,一个文件中,所有出现这个字样的地方都会被高亮显示.按n键,就可以自动把光 ...
- jquery 取得select选中的值
1.取得选中的值 jQuery("#select").val();是取得选中的值 2.取得的文本 jQuery("#select option:selected&quo ...
- 创建一个自己的Vue UI组件库,并将它发布在npm上
本文仅限于入门级,没有成规模制作,希望能对你有所帮助. 因为在开发多个项目中可能会用到同一个组件,那么我们通过复制粘贴的形式更新,无异于是笨拙的,我们可以通过上传到npm后,不断迭代npm包来实现更新 ...
- python爬虫—— 抓取今日头条的街拍的妹子图
AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 近期在学习获取j ...
- 经典面试题golang实现方式(一)
以下所有题目的关键信息都会用[]括起来,我们不对题目进行分析,只给出题目的解决方案:如有疑问请不吝赐教. 题目: 请实现一个算法,确定一个字符串的所有字符[是否全都不同].这里我们要求[不允许使用额外 ...
- 怎么给slice加一个Insert方法呢?而不用丑陋的两次append….
package main import ( "fmt" "reflect" ) func Insert(slice interface{}, pos int, ...