入口(entry)、出口(output)、加载器(loader)、插件(plugins)css
项目名不能有汉字,不能取名叫 webpackhtml
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文件都是压缩后的, 开发环境下代码通常是不压缩的
src/index.html
html => ul#list>li{我是 li \$}\*10
npm i jquery
, 而且引入 jquery
main.js
, 在 main.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
为何 dist文件下的main.js
文件里的代码忽然这么多前端
看图 (打包流程)node
code 记得保存一份jquery
src
源文件 : index.html
和main.js
1-命令行 2-配置项webpack
* "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' }
做用 : 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 打包提供一个服务器环境es6
npm i -D webpack-dev-server
"dev" : "webpack-dev-server"
npm run dev
--open
--port 3001
--hot
( 整个页面和整个项目打包 )演示: 在浏览器调试样式的地方去掉ul的样式(不加--hot改变文件的css样式改变时候ul样式又出现,由于全局刷新了,加上后局部更新) /* background: skyblue; */ 而后分别看 加 --hot 和 不加 --hot 的区别 从新运行脚本
// hot 不要写在配置文件里面,,否则的话还要配其余插件麻烦 "dev" : "webpack-dev-server --hot", devServer : { open : true, port : 3001 }
npm run dev
==> 不会打包的 ,只会把项目放到服务器里2.1 执行 : `npm run build` 对项目进行打包,生成dist文件 2.2 模拟本地服务器 : 安装 : `npm i -g http-server` 2.3 把dist文件里的内容放到服务器里便可, 直接运行`http-server`
webpack 只能处理 js 文件,非 js(css.less.图片.字体等)处理处理不了, 借助 loader 加载器web
main.js
中引入 import '../css/index.css';
ul { style-list : none }面试
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'] } ] }
import '../css/index.less';
npm i -D less-loader less style-loader css-loader
module->rules
less
ul { background-color: aqua; li { &:hover { color: yellow; } } }
配置 :npm
{ test :/\.less$/, use : ['style-loader','css-loader','less-loader'] },
设置背景图片.cls {
width: 300px;
height: 300px;
background: url('../css/4.jpg');
background-size: 100%;
}
npm i -D url-loader file-loader
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
或者 从阿里矢量图标
里下载
拷贝到项目中的 css 文件夹中
在 main.js 中引入 css 文件
import '../css/iconfont/iconfont.css'
使用 :
在 webpack.config.js 中配置
// 4. 处理字体图标 { test:/\.(svg|woff|woff2|ttf|eot)$/,use:'url-loader'}
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)