ES Moudule模块引入规范
引入:import from 导出:export default
CommonJS模块引入规范
引入:require() 导出:module.exports
webpack核心定义 模块打包工具
webpack安装
node + 进入文件夹npm init(符合node规范) + npm install webpack webpack-cli -g 全局安装 不推荐
npm uninstall webpack webpack-cli -g 全局卸载webpack
node + 进入文件夹npm init(符合node规范) + npm install webpack webpack-cli -D 项目内安装
npx webpack -v 查看当前目录webpack
webpack配置
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');
module.exports = {
mode: 'production', // 打包文件压缩 developmen 不压缩
devtool: 'source-map', // 映射关系 inline放在index.js里 cheap具体到行不具体到列 module loader错也会提示 eval
entry: {
main: './src/index.js', // 在哪开始打包
sub: './src/index.js', // 打包两次
},
devServer: {
contentBase: './dist', // 起服务器 可以发ajax请求 ajax请求必须通过http方式发送
open: true, // 自动打开浏览器
port: 8080, // 默认端口号
hot: true, // 开启HMR 热模块更新
hotOnly: true, // 即便HRM未生效也不让浏览器自动刷新
proxy: { // vue react 底层都使用webpackDevServer而webpackDevServer支持proxy
'/api': 'http://localhost:3000',
},
},
module: { // 规则
rules: [
{
test: /\.js$/, // es6 babel 配置
exclude: /node_modules/, // 如果你JS文件在node_modules里面就不使用
loader: "babel-loader" // 打通babel和webpack
options: {
presets: [["@babel/preset-env",{ // 业务代码时用这个
targets: {
chrome: "67", // 打包运行在大于67版本谷歌浏览器 就不用babel/polyfill
},
useBuiltIns: 'usage' // 当我做babel/polyfill填充时候 按需加载
}]], // 配置babel preset 语法转换
"plugins": [["@babel/plugin-transform-runtime",{ // 库代码时用这个 不污染全局环境
"corejs": 2,
"helpers": true,
"regenerator": true,
"useESModules": flase
}]]
}
},
{
test: /\.(jpg|png|gif)$/, // 图片配置
use: {
loader: 'url-loader', // 需要安装 'url-loader' 文件小用,直接将图片转成base64放到js文件里
options: {
// placeholder 占位符
name: '[name]_[hash].[ext]', // 打包后名字不变
outputPath: 'images/', // 图片输出文件夹
limit: 20480, // 图片大小超过20480字节(20kb)就会采用 'file-loader'
}
}
},
{
test: /\.scss$/, // 样式配置
use: [
'style-loader', // 挂载css到head下
{
loader: 'css-loader', // 整合css
options: {
importLoaders: 2, // 嵌套sass文件也不会有问题
modules: true, // 开启css模块化
}
},
'sass-loader',
'postcss-loader' // 配置文件见下方代码
], // 执行顺序 下到上 右到左
},
{
test: /\.css$/, // 样式配置
use: [
'style-loader', // 挂载css到head下
'css-loader', // 整合css
'postcss-loader' // 配置文件见下方代码
], // 执行顺序 下到上 右到左
},
{
test: /\.(eot|ttf|svg)$/, // 字体文件配置
use: {
loader: 'file-loader',
}
},
]
},
output : { // 打包后
filename: '[name].js', // 打包后的名字 取entry的键值
path: path.resolve(__dirname,'dist'), // 打包后放在哪个文件夹下 __dirname表示webpack默认所在文件
publicPath: 'http://cdn.com.cn', // index.js引入js前缀地址
},
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html' // 自定义新建index.html模板
}),
new CleanWebpackPlugin(['dist']), // 打包前删除dist目录
new webpack.HotModuleReplacementPlugin(), // 开启HMR
],
// htmlWebpackPlugin 会在打包结束后,自动生成一个html文件,并把打包生成的js自动引入到这个html文件中
}
// postcss.config.js
module.exports = {
plugins: [
require('autoprefixer') // autoprefixer 插件 添加厂商前缀 适配浏览器
]
}
webpack-cli 可以在命令行里正确运行webpack命令
webpack核心概念 1. Loader是什么(module -> rules) webpack不能识别非js结尾的后缀模块,loader帮忙识别出来的一个打包方案。 2. plugins是什么 webpack 插件 使打包更便捷 可以在webpack运行到某个时刻的时候,帮你做一些事情 类似生命周期函数 3. sourceMap是什么 存储着打包后的index.js文件每一行代码对应源码里面的哪个位置 影响打包速度 需要构建映射关系 4.webpackDevServer是什么 模拟服务器特性 自动打开浏览器 5.Hot Module Replacement是什么 可以在写css时候方便调试不会刷新页面而是直接替换css js的话需要module.hot.accept 6.Babel处理ES6 安装:npm install --save-dev babel-loader @babel/core 打通babel和webpack 配置: module rules 安装: npm install @babel/preset-env --save-dev 用来翻译 安装:npm install --save @babel/polyfill 用来提供新方法 在业务代码中 import "@babel/polyfill" 提高开发效率
// package.json
"scripts": {
"bundle": "webpack" //最原始打包webpack 最麻烦每次需执行
"watch": "webpack --watch" // 时刻监听代码变化 自动打包
"start": "webpack-dev-server" // 不但可以时刻监听代码变化自动打包还会自动刷新浏览器 可以自动打开浏览器 可以起服务器 dist目录放在内存里
//"middleware": "node server.js" // 当运行npm run middleware的时候自己写一个服务器
}