webpack 从入门到放弃
2021-02-01 23:14
标签:次数 概念 htm 目录 假设 cti 编译 等于 follow webpack 有四个核心概念: 入口entry,出口output,加载器loader,插件plugins 项目名不能有汉字,不能取名叫 webpack webpack 打包有两种方式 1-命令行 2-配置项 作用 : 为使用 webpack 打包提供一个服务器环境 webpack 只能处理 js 文件,非 js(css.less.图片.字体等)处理处理不了, 借助 loader 加载器 创建一个 css 文件, 然后在 ul { style-list : none } 配置 : 安装 : url-loader (推荐) 和 file-loader 二选一即可 准备字体图标: 字体图标文件 拷贝到项目中的 css 文件夹中 在 main.js 中引入 css 文件 使用 : webpack 从入门到放弃 标签:次数 概念 htm 目录 假设 cti 编译 等于 follow 原文地址:https://blog.51cto.com/13132323/2506296webpack 第一阶段
命名初始化阶段
package.json
, 命令 : npm init -y
npm i -D webpack webpack-cli
webpack : 是 webpack 工具的核心包
webpack-cli : 提供了一些在终端中使用的命令
-D(--save-dev) : 表示项目开发期间的依赖,也就是 : 线上代码中用不到这些包了
main.js
文件console.log(‘我就要被打包了,哦也‘);
package.json
的scripts
中,添加脚本 "scripts": {
"build": "webpack main.js"
},
// webpack 是webpack-cli 中提供的命令, 用来实现打包的
// ./main.js 入口文件,要打包哪个文件
npm run build
mode
"build" : "webpack ./main.js --mode development"
// WARNING in configuration
// The ‘mode‘ option has not been set, webpack will fallback to ‘production‘ for this value.
// 如果没有设置 mode 配置项, webpack 会默认提供 开发环境(production)
// Set ‘mode‘ option to ‘development‘ or ‘production‘ to enable defaults for each environment.
// 项目开发的两种环境
1. 开发环境 (development) : 开发过程就是开发环境
2. 生产环境 (production) : 线上环境, 也就是 : 项目做好了,发布上线
生产环境下, 打包生产的js文件都是压缩后的, 开发环境下代码一般是不压缩的
// 使用ES6的模块化语法
import $ from ‘jquery‘ // 优点 不用沿着路径去找
$(‘#list > li:odd‘).css(‘backgroundColor‘, ‘red‘)
$(‘#list > li:even‘).css(‘backgroundColor‘, ‘green‘)
// 语法报错
// 引入 main.js 会报错,因为浏览器不支持这个import 的Es6语法
// npm run build 之后
// 引入 dist/main.js 后会ok,因为webpack 帮我们转化为浏览器能够识别的es5语法了
//1. 如果index.html 中引入 jquery , 再引入 mian.js (没有引入jquery了) => ok
//2. 如果index.html 中没有引入 jquery , 直接使用es6的模块化语法 import , 引入main.js就会报错
//3. 如果index.html 中没有引入 jquery , 直接使用es6的模块化语法 import , webapck打包出 dist/main.js 引入 dist/main.js ==> ok
webpack 第二阶段
webpack 配置文件
src
源文件 : index.html
和main.js
* "build" : "webpack ./mian.js" --mode development
* npm run build
* 一般情况下 : 改为
* "build" : 入口 --output 出口
* "build": "webpack ./src/js/main.js --output ./dist/bundle.js --mode development",
*
* 验证 : index.html 引入 bundle.js
第一步 : 项目`根目录`下, 创建一个 `webpack.config.js`文件 (文件名固定死)
专门指定其他文件 : --config webpack.XX.js
第二步 : 在 `webpack.config.js` 中,进行配置
// webpack 是基于 node的 , 所以配置文件符合 node 方式书写配置
// 注意 : 不要再这个文件中使用ES6的的模块化 import语法
// main.js里可以使用,是因为要通过webpack转化为es5的
// 而这个是webpack 的配置文件,,它是要转化别人的,所以必须要通过
第三步 : 修改 `package.json` 中的 `scripts` , 脚本命令为: "build": "webpack"
第四步 : 执行命令 : `npm run build`
const path = require(‘path‘)
module.exports = {
// 入口
entry: path.join(__dirname, ‘./src/js/main.js‘),
// 出口
output: {
// 出口目录
path: path.join(__dirname, ‘./dist‘),
filename: ‘bundle.js‘
},
// 开发模式
mode: ‘development‘
}
webpack 配置文件 html-webpack-plugin
作用 :
1. 能够根据指定的模板文件 (index.html),自动生成一个新的 index.html,并且注入到dist文件夹下
2. 能够自动引入js文件
npm i html-webpack-plugin
第一步: 引入模块
const htmlWebpackPlugin = require(‘html-webpack-plugin‘)
第二步: 配置
// 插件
plugins: [
// 使用插件 指定模板
new htmlWebpackPlugin({
template: path.join(__dirname, ‘./src/index.html‘)
})
]
webpack 配置文件 : webpack-dev-server
npm i -D webpack-dev-server
"dev" : "webpack-dev-server"
npm run dev
--open
--port 3001
--hot
( 整个页面和整个项目打包,热更新,局部更新 )演示: 在浏览器调试样式的地方去掉ul的样式 /* background: skyblue; */
然后分别看 加 --hot 和 不加 --hot 的区别
重新运行脚本
// hot 不要写在配置文件里面,,不然的话还要配其他插件麻烦
"dev" : "webpack-dev-server --hot",
devServer : {
open : true,
port : 3001
}
webpack 第三阶段 打包上线
npm run dev
==> 不会打包的 ,只会把项目放到服务器里2.1 执行 : `npm run build` 对项目进行打包,生成dist文件
2.2 模拟本地服务器 : 安装 : `npm i -g http-server`
2.3 把dist文件里的内容放到服务器里即可, 直接运行`http-server`
webpack 第四阶段 : 打包非js文件
处理 css 文件
main.js
中引入 import ‘../css/index.css‘;
npm i -D style-loader css-loader
webpack.config.js
中,添加个新的配置项 module
module
中添加 loader
来处理 css
// loader
module: {
rules: [
//1.处理 css
// 注意点 use执行loader 顺序 从右往左
// css-loader : 读取css文件内容,将其转化为一个模块
// style-loader :拿到模块, 创建一个style标签,插入页面中
{ test: /\.css$/, use: [‘style-loader‘, ‘css-loader‘] }
]
}
处理 less 文件
import ‘../css/index.less‘;
npm i -D less-loader less style-loader css-loader
module->rules
less
{ test :/\.less$/, use : [‘style-loader‘,‘css-loader‘,‘less-loader‘] },
处理 图片 文件
npm i -D url-loader file-loader
// 处理图片
{ test : /\.(jpg|png)$/, use : [‘url-loader‘] },
原始: background-image: url(../images/1.jpg);
处理后: background-image: url(9c9690b56876ea9b4d092c0baef31bb3.jpg);
方式1 :{ test : /\.(jpg|png)$/, use : [‘url-loader?limit=57417‘] },
方式2 :
{
test: /\.(jpg|png)$/, use: [
{
loader: ‘url-loader‘,
options: {
// 比57417这个小 => 转化为base64
// 大于等于这个57417值 => 不会转base64 内部调用 file-loader 加载图片
limit: 57417
}
}
]
},
处理 字体 文件
iconfont
或者 从阿里矢量图标
里下载 // 4. 处理字体图标
{ test:/\.(svg|woff|woff2|ttf|eot)$/,use:‘url-loader‘}
处理 ES6 语法
而其他的 js 新语法,应该使用 babel 来处理var o = { ...obj }
在谷歌上可以,edge 就不可以
npm i -D babel-core babel-loader@7
npm i -D babel-preset-env babel-preset-stage-2
babel-polyfill与babel-plugin-transform-runtime
也是做兼容处理的,以前都是用这个,兼容更早的 { test: /\.js$/, use: ‘babel-loader‘, exclude: /node_modules/ }
.babelrc
{
"presets": [
"env",
"stage-2"
],
-----------
// 暂时不用
// 如果未来某一天真的用到了polify
"plugins": [
["transform-runtime", {
"helpers": false,
"polyfill": true,
"regenerator": true,
"moduleName": "babel-runtime"
}]
var obj = {
name: ‘zs‘,
age: 20
}
var o = { ...obj }
console.log(o)
实例
#package.json
"scripts": {
"build": "webpack",
"dev": "webpack-dev-server --hot"
}
# webpack.config.js
const path = require(‘path‘)
const htmlWebpackPlugins = require(‘html-webpack-plugin‘)
module.exports = {
entry: path.join(__dirname, ‘src/main.js‘),
output: {
path: path.join(__dirname, ‘dist‘),
filename: ‘app.js‘
},
mode: ‘development‘,
plugins: [
new htmlWebpackPlugins({
template: path.join(__dirname, ‘src/index.html‘)
})
],
devServer: {
port: 8999,
open: true
},
module: {
rules: [{
test: /\.css$/,
use: [‘style-loader‘, ‘css-loader‘]
},
{
test: /\.less$/,
use: [‘style-loader‘, ‘css-loader‘, ‘less-loader‘]
},
{
test: /\.(svg|woff|woff2|ttf|eot)$/,
use: ‘url-loader‘
},
{
test: /\.js$/,
use: ‘babel-loader‘,
exclude: /node_modules/
}
]
}
}
# .babelrc文件就不在重复展示了
上一篇:Web安全(1)
下一篇:CSS7 - ColorUI