npm init -y
npm install webpack webpack-cli --save-dev
./src/index.js
,但你可以通过在 webpack configuration
中配置 entry
属性,来指定一个(或多个)不同的入口起点node_modules
module.exports = 'zsy'
let title = require('./title.js');
console.log(title)
const path = require('path');
module.exports = {
mode: 'development',
// 入口写法一:字符串
// entry: './src/index.js',
// 入口写法二:数组形式
// entry: ['./src/index1.js', './src/index2.js'], // 其实还是单入口,即只有一个入口,只不过有两个文件而已
// 入口写法三:对象形式
entry: {
main: './src/index.js',
// main: ['./src/index1.js', './src/index2.js'], // 效果与上面的数组形式是一样的
},
};
{
// ......
"scripts": {
"build": "webpack"
},
// ......
}
output
属性告诉 webpack 在哪里输出它所创建的 bundle
,以及如何命名这些文件./dist/main.js
,其他生成文件默认放置在 ./dist
文件夹中。webpack.config.js
// ......
module.exports = {
// ......
output: {
// 表示要 向dist文件下写入 main.js 文件,下面代码的配置都是默认值,不写也是会默认打包到 dist/main.js
path: path.resolve(__dirname, 'dist'),
filename: 'main.js'
}
};
module.exports = {
// ......
entry: {
index1: './src/index1.js',
index2: './src/index2.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js' // 这个name是对应entry 对象中的key
}
};
webpack
只能理解 JavaScript
和 JSON
文件,也就是在js文件中,webpack只认识 require(‘xxx.js’) 或 require(‘xxx.js’) 这两种文件,比如不认识 xx.txt 文件loader
让 webpack
能够去处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用,以及被添加到依赖图中webpack.config.js
npm i raw-loader -D
// ......
module.exports = {
// ......
module: {
rules: [
{
// 当遇到以 .txt 结尾的文件时,会交给 raw-loader 去处理
test: /\.txt$/,
use: [ 'raw-loader' ] // raw-loader 意思是 '原生loader'
}
]
}
};
src\name.txt
‘peiqi’
src\index.js
let name = require('./name.txt')
console.log('我的名字', name.default) // webpack打包后,外层会包一层,所以取 default 属性才是真的值
<body>
<script src="./main.js">script>
body>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>webpack5title>
head>
<body>
body>
html>
npm i html-webpack-plugin -D
// ......
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// ......
plugins: [
// HtmlWebpackPlugin 插件会向输出目录dist下写入一个 【index.html】 文件,并且将打包后的文件,即main.js 自动引入到index.html去
new HtmlWebpackPlugin({
template: './src/index.html', // 指定使用的模板页面
filename: 'index.html' // 打包后的模板页面名称
})
]
};
选项 | 描述 |
---|---|
development | 会将 process.env.NODE_ENV 的值设为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin |
production | 会将 process.env.NODE_ENV 的值设为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin |
开发环境
生产环境
其默认值为 production
--mode
用来设置模块内的process.env.NODE_ENV
--env
用来设置webpack
配置文件的函数参数cross-env
用来设置node
环境的process.env.NODE_ENV
DefinePlugin
用来设置模块内的全局变量production
webpack serve
(开发服务器)的mode默认为development
process.env.NODE_ENV
获取当前的环境变量,无法在webpack配置文件中获取此变量比如在package.json:
"scripts": {
// 当不在webpack.config.js设置mode,那么当执行 npm run build,则默认都是生产环境(production)
"build": "webpack",
// webpack4 是要执行 webpack-dev-server
// webpack5直接执行 webpack serve 就ok了
// 不过还是需要安装 webpack-dev-server 的,即:npm i webpack-dev-server -D
// 当不在webpack.config.js设置mode,那么当执行 npm run start,则默认都是生产环境(production)
"start": "webpack serve"
},
src\index.js
// 查看当前是开发环境还是生产环境
console.log(process.env.NODE_ENV);// development | production
webpack.config.js
console.log('NODE_ENV',process.env.NODE_ENV);// undefined
"scripts": {
"build": "webpack --mode=production",
"start": "webpack --mode=development serve"
},
"scripts": {
// 通过 --env=production 这样设置,那么在 webpack.cconfig.js 中不能 打印出 process.env.NODE_ENV,在 src/index.js 等模块中也是不能 打印出来的
"build": "webpack --env=production",
"start": "webpack serve --env=development",
}
index.js
// 通过 --env=production 这样设置,在模块内拿不到
console.log(process.env.NODE_ENV);// undefined
webpack.config.js
// 通过 --env=production 这样设置,在 webpack.config.js 也拿不到
console.log('NODE_ENV',process.env.NODE_ENV);// undefined
// 但是如果配置文件导出一个函数,那么 webpack.config.js 就可以拿到了
module.exports = (env,argv) => {
console.log('env',env);// development | production
return {
// 写入口 出口等配置项
// ......
}
};
module.exports = {
/**
"scripts": {
"build": "webpack --mode=production",
"start": "webpack --mode=development serve"
},
*/
// 如下配置的优先级低于上面的配置方式:
mode: 'development'
}
// ......
const webpack = require('webpack')
module.exports = ()=>{
console.log('env', env);
let isDevelopment = env.development
let isProduction = env.production
return {
plugins:[
// ......
new webpack.DefinePlugin({
// 这里必须使用 JSON.stringify 包一层
// 否则打包后是变量,而不是字符串
'process2.env2.NODE_ENV2':JSON.stringify(isDevelopment? 'development': 'production'),
})
]
}
}
npm run start 和 npm run test 的run 都可以直接省略
index.js
console.log('process.env.NODE_ENV2',process2.env2.NODE_ENV2);// production
webpack.config.js
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// undefined
console.log('NODE_ENV',NODE_ENV);// error !!!
npm i cross-env -D
"scripts": {
"build": "cross-env NODE_ENV=production webpack", // 执行这个命令, NODE_ENV对应得值 production就会传给 process.env.NODE_ENV,那么 webpack.config.js就可以拿到,不会直接传给 js模块
"start": "cross-env NODE_ENV=development webpack serve"
}
webpack.config.js
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// 执行npm run build,输出:process.env.NODE_ENV production
module.exports = (env)=>{
return {
mode: process.env.NODE_ENV, // 也给到这儿
// ......
plugins:: [
new webpack.DefinePlugin({
// 下面的 NODE_ENV 只是一个名字,可以随便取,然后在js文件中直接取该名字就可以得到 process.env.NODE_ENV
'peiqi': JSON.stringify(process.env.NODE_ENV) // 也给到这儿
})
]
}
}
src\index.js:
console.log('mode设置的是:', process.env.NODE_ENV) // 输出:production
console.log('DefinePlugin设置的:', peiqi) // 输出:production
安装:
# dotenv-expand: 增强版的 .env,在.env文件可以使用模板字符串的形式
npm i dotenv-expand -D
# 普通版的 .env,在.env文件只能设置 key-value
npm i dotenv -D
.env
文件中项目根目录 \ .env
MONGODB_HOST=localhost
MONGODB_PORT=27017
MONGODB_DB=test
MONGODB_URI=mongodb://${MONGODB_HOST}:${MONGODB_PORT}/${MONGODB_DB}
项目根目录 \ testEnv.js :
const dotenv = require('dotenv')
const dotenvExpand = require('dotenv-expand')
const dotenvFile = '.env';
let myEnv = dotenv.config({
path: dotenvFile,
})
dotenvExpand.expand(myEnv)
console.log(process.env.MONGODB_HOST); // 输出:localhost
console.log(process.env.MONGODB_PORT); // 输出:27017
console.log(process.env.MONGODB_DB); // 输出:test
console.log(process.env.MONGODB_URI); // 输出:mongodb://localhost:27017/test