核心部分:
- entry
- output
- mode:
- loader:
- plugin:
启动配置修改package.json
"scripts":{
"start": "webpack serve",
"build": "webpack"
}
编译后内容
在src目录下,创建index.js和title.js。index作为入口文件。 ```javascript // index.js const title = require(“./title”); console.log(title);
// title.js require(“lodash”)
exports.name = “hello”; module.exports = “titles”;
经过webpack编译后
```javascript
// webpack 编译后,外层一个自执行函数
(() => {
var modules = {
// 函数3个参数,后2个可省略,如果使用到才会显示
// exports 对应着在module文件中需要使用exports.xxx 这样导出
// __webpack_require__ 对应着使用了require/import这样导入文件
"./src/title.js": (module, exports, __webpack_require__) => {
__webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js");
exports.name = "hello";
module.exports = "titles";
},
};
var cache = {}; // 定义缓存,如果缓存有值,直接使用缓存
function __webpack_require__(moduleId) {
if (cache[moduleId]) {
return cache[moduleId].exports;
}
// 定义module.exports = {}
var module = (cache[moduleId] = { exports: {} });
modules[moduleId](module, module.exports, __webpack_require__);
return module.exports;
}
// 从entry入口处开始执行,也是调用自执行函数
// index.js
(() => {
// __webpack_require__ 是webpack 自定义的函数执行
let title = __webpack_require__("./src/title.js");
console.log(title);
})();
})();
配置devServer
修改webpack.config.js
module.exports = {
devServer: {
static: resolve(__dirname, "dist"),
compress: true,
port: 8001,
open: true,
},
}
使用loader处理文件
处理css、scss、less等文件
module.exports = {
module: {
rules: [
// ...
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
}
处理jpg、png、gif、bmp等图片
module.exports = {
module: {
rules: [
// ...
{
test: /\.(jpg|png|gif|svg|bmp)$/,
use: ["file-loader"],
}
],
},
}
引入图片的方式
- 从静态目录下,直接通过img标签 绝对路径引入,需要配置devServer.static
- 通过 require import引入
- 通过css文件的url引入,是通过css-loader进行解析处理
在html中直接通过 相对路径引入,需要将html用html-loader处理
url-loader和file-loader的区别
url-loader比file-loader多了limit配置,小于改设置时,图片以base64显示
- url-loader是对file-loader的增强。
-
转ES6、7,react的jsx为es5
安装依赖
yarn add babel-loader @babel/core @babel/preset-env
@babel/preset-react @babel/polyfill
@babel/plugin-proposal-decorators
@babel/plugin-proposal-class-properties -D
@babel/plugin-proposal-decorators:可以使用装饰器语法
@babel/plugin-proposal-class-properties:使用class类语法
module.exports = {
module: {
rules: [
{
test: /\.jsx?$/,
use: [
{
loader: "babel-loader",
options: {
presets: [
[
"@babel/presets-env",
{
useBuiltIns: "usage", // 按需加载polyfill
corejs: { version: 3 }, //指定corejs版本
targets: { //指定浏览器版本
chrome: "60",
firefox: "60",
ie: "9",
safari: "10",
edge: "17",
},
},
], "@babel/presets-react"],
plugins: [
["@babel/plugins-proposal-decorators", { legacy: true }],
["@babel/plugin-proposal-class-properties", { loose: true }],
],
},
},
],
}
]
}
}
devTool设置source-map
| eval | 不产生source-map信息,使用eval包裹代码块 | | —- | —- | | source-map | 产生source-map文件, 包含行、列信息 | | cheap | source-map文件内,不包含列信息,也不包含loader产生的source-map | | module | 包含loader产生的source-map | | inline | 将map信息作为DataURI内嵌到js文件,不单独产生source-map |
开发环境推荐使用cheap-module-eval-source-map
- module包含信息全,包含了loader信息。eval有缓存可以更快
生产环境推荐使用hidden-source-map
直接安装包,进行导入使用
import _ from "lodash";
- 使用插件, webpack.ProvidePlugin进行导入
- 在plugins中使用
new webpack.ProvidePlugin({_: 'lodash'})
- 在plugins中使用
- 使用expose-loader
- CDN结合externals引入。
- 模版html引入lodash链接地址
- 在webpack.config.js中设置
externals: { lodash: '_' }
- 使用插件html-webpack-externals-plugin, 进行引入
plugins:[
new HtmlWebpackExternalsPlugin({
externals: [
{
module: 'jquery',
entry: 'dist/jquery.min.js',
global: 'jQuery',
},
],
})
]
设置环境变量
通过webpack设置
直接在命令行配置webpack --env=dev --open
;
这种方式设置的变量,会被传递到函数中作为参数。module.exports = (env)=>{
console.log(env);
return {
//....
}
}
通过cross-env设置
在mac环境需要设置export NODE_ENV = dev webpack;
在window需要set NODE_ENV = dev webpack
通过cross-env可以跨环境设置env;cross-env NODE_ENV=dev webpack;
直接在webpack.config.js中通过process.env获取const nodeEnv = process.env.NODE_ENV;
console.log(nodeEnv);