webpack 作用
- Webpack 唯一的功能就是打包
安装 webpack
cnpm install webpack -g
webpack配置文件
webpack,config.js
-
module.exports={ mode:'none','production','development', entry:'入口' || {roukou1:'',roukou2:''}, output:{ path, filename } }
案例
- 多入口
webpack.config.js
-
可使用 [name]作为占位符const path = require('path'); module.exports={ mode:'development', entry:{ index:'/src/1.js', admin:'/src/2.js' }, output:{ path:path.resolve(__dirname,'build'), filename:'[name].min.js' } }
-
- 1.js
-
let a =10; alert(a);
-
- 2.js
-
import $ from 'jquery'; $(()=>{ alert(10); });
-
- 打包结果
loader
- 帮助 webpack 处理 js 以外的文件
- 安装
css-loader
和style-loader
- loader 顺序为从后往前执行
css-loader style-loader
- webpack.config.js
const path = require('path'); module.exports={ mode:'development', entry:{ index:'/src/js/1.js', admin:'/src/js/2.js' }, output:{ path:path.resolve(__dirname,'build'), filename:'[name].min.js' }, module:{ rules:[ { test:/\.css$/, use:['style-loader','css-loader'] } ] } }
- css文件
body{background: yellow;}
- js文件
import $ from 'jquery'; import '../css/main.css'; $(()=>{ alert(10); });
- 打包
- 打包结果
- 浏览器中查看效果
- html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="build/2.min.js"></script> </head> <body> </body> </html>
- 结果
- html代码
postcee-loader 和 autoprefixer
- postcee-loader 给浏览器添加 前缀
- autoprefixer 选择性添加前缀 配合 postcss-loader使用
- webpack.config.js
const path = require('path'); module.exports={ mode:'development', entry:'/src/js/1.js', output:{ path:path.resolve(__dirname,'build'), filename:'bundle.min.js' }, module:{ rules:[ { test:/\.css$/, use:['style-loader','css-loader','postcss-loader'] } ] }, }
- postcss.config.js中
module.exports = { "plugins": [ require('autoprefixer')({ browsers: [ "> 1%", "last 2 versions", "not ie <= 8" ] }) ] }
- 结果
自动添加了前缀
- 注意
file-loader
- 作用:file-loader可以用来帮助webpack打包处理一系列的图片文件;比如:.png 、 .jpg 、.jepg等格式的图片;
- 使用file-loader打包图片的结果:使用file-loader打包的图片会给每张图片都生成一个随机的hash值作为图片的名字;
- 打包结果
url-loader
- url-loader可以设置图片大小限制,当图片超过限制时,其表现行为等同于file-loader,而当图片不超过限制时,则会将图片以base64的形式打包进css文件,以减少请求次数。
limit
控制文件的大小 如:8*1024
表示8k以内转DataURL- webpack.config.js
注:const path = require('path'); module.exports = { mode: 'development', entry: '/src/js/1.js', output: { path: path.resolve(__dirname, 'build'), filename: 'bundle.min.js' }, module: { rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] }, { test: /\.(jpg|png|gif)$/i, use: { loader: 'url-loader', options: { outputPath: 'img/', limit: 8 * 1024, esModule:false } }, type:'javascript/auto' } ] }, }
- 结果
- base64
- 正常图片
- base64
- 结果
编译es6
cnpm i babel-loader @babel/core @babel/preset-env -D
- webpack.config.js
const path = require('path'); module.exports = { mode: 'development', entry: '/src/js/1.js', output: { path: path.resolve(__dirname, 'build'), filename: 'bundle.min.js' }, module: { rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] }, { test: /\.(jpg|png|gif)$/i, use: { loader: 'url-loader', options: { outputPath: 'img/', limit: 8 * 1024, esModule: false } }, type: 'javascript/auto' }, { test: /\.jsx?$/i, exclude: '/node_modules/', //不编译 node_modules use: { loader: 'babel-loader', options: { presets: [ ["@babel/preset-env", { "targets": { "browsers": ["> 1%", "last 2 versions"] } }] ], } } }, ] }, }
- 1.js
import '../css/main.css'; let a = 12; let b = 15; const sum = (n1, n2) => { return n1 + n2; } alert(sum(a, b));
- 编译结果
source-map 查看在源文件中错误的位置
- 1.js
import '../css/main.css'; let a = 12; let b = 15; const sum = (n1, n2) => { return n1 + n2; } alert(sum(a, c));
- 结果
代码风格管理 eslint
- 安装:
cnpm i eslint eslint-loader -D
- 配置文件
.eslintrc
{ "root": true, "parserOptions":{ "sourceType": "module", "parser": "babel-eslint", "ecmaVersion": 2015 }, "env": { "browser": true }, "rules": { "indent": ["error", 2],//缩进, 两个空格 "linebreak-style":["error","windows"],//换行 "quotes": ["error", "double"],//引号 都是双引号 "semi": ["error", "always"],//结尾 必须分号 "no-console": "error", "arrow-parens": 0 } }
- webpack.config.js
const path = require('path'); module.exports = { mode: 'development', //模式 entry: './src/js/1.js', //入口 //出口 output: { path: path.resolve(__dirname, 'build'), filename: 'bundle.min.js' }, module: { rules: [{ test: /\.jsx?/i, loader: 'eslint-loader', exclude: '/node_modules/', options: { esModule: false } }] }, devtool: 'source-map' }
- 1.js
let a = 12; let b = 50; const sum = (n1, n2) => { return n1 + n2; }; alert(sum(a,b));
dev-server
- 作用:这个工具不仅能帮我们打包,还能帮我们起了服务器。还能帮我们自动打开浏览器,还能自动更新
- 安装
cnpm i webpack webpack-cli webpack-dev-server -D
- 案例:
const path = require('path'); module.exports = { mode: 'development', entry: '/src/js/1.js', output: { path: path.resolve(__dirname, 'build'), filename: 'bundle.min.js' }, module: { rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] }, { test: /\.(jpg|png|gif)$/i, use: { loader: 'url-loader', options: { outputPath: 'img/', limit: 8 * 1024, esModule: false } }, type: 'javascript/auto' }, { test: /\.jsx?$/i, exclude: '/node_modules/', //不编译 node_modules use: { loader: 'babel-loader', options: { presets: [ ["@babel/preset-env", { "targets": { "browsers": ["> 1%", "last 2 versions"] } }] ], } } }, ] }, devtool:'source-map', // 配置 webpack-dev-server devServer:{ // 新版本 webpack 不支持 contentBase 应添加下面这段话,已显示目录 static:{ directory:__dirname, }, open:true // 是否自动打开浏览器 } }