webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序須要的每一個模塊,而後將全部這些模塊打包成一個或多個 bundlecss
代碼轉換、文件優化、代碼分割、模塊合併、自動刷新、代碼校驗、自動發佈
複製代碼
mkdir webpack-test && cd webpack-test
mkdir src
touch src/index.js
複製代碼
npm init -y 初始文件(默認的)
npm init
複製代碼
npx webpack
複製代碼
touch webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devServer: { // 開發服務器的配置
contentBase: path.join(__dirname, 'dist'),
compress: true,
port: 3000
},
mode: 'development', // 模式 默認兩種production development
entry: './src/index.js', //入口
output: {
filename: 'bundle.js', //打包後的文件名
path: path.resolve(__dirname, 'dist'), //路徑必須是一個絕對路徑
},
plugins: [// 數組放着全部的webpack插件
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html'
})
]
}
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="root"></div>
<script src="bundle.js"></script>
</body>
</html>
複製代碼
var root = document.getElementById("root");
root.innerHTML="你好"
複製代碼
npm i webpack webpack-cli -D
npm i html-webpack-plugin -D
複製代碼
npm i html-webpack-plugin -D
複製代碼
npm i webpack-dev-server -D
複製代碼
{
"name": "webpack-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"html-webpack-plugin": "^3.2.0",
"webpack": "^4.30.0",
"webpack-cli": "^3.3.0",
"webpack-dev-server": "^3.3.1"
}
}
複製代碼
npm run dev
複製代碼
body{
background-color:red;
}
複製代碼
require('./index.css');
複製代碼
module: { //模塊
rules: [ // 規則 css-loader
// style-loader 把css插入到head的標籤中
// loader的特色: 但願單一
// loader的用法: 字符串只用一個loader
// 多個loader須要[]
// loader的順序 默認是從右向左執行
// loader還能夠寫出對象方式
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
]
}
複製代碼
npm i css-loader style-loader -D
複製代碼
body{
#root{
border:1px yellow solid;
color: #000;
}
}
複製代碼
require('./index.css');
複製代碼
{
test: /\.less$/,
use: [
{
loader: 'style-loader',
},
'css-loader','less-loader'
]
},
複製代碼
npm i less less-loader -D
複製代碼
npm i mini-css-extract-plugin -D
複製代碼
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
plugins: [
new MiniCssExtractPlugin({
filename: 'main.css'
})
],
module: { //模塊
use: [
MiniCssExtractPlugin.loader,
]
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
]
}
]
}
複製代碼
npm i postcss-loader autoprefixer -D
複製代碼
module.exports = {
plugins: [require('autoprefixer')]
}
複製代碼
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
// options: {
// insertAt: 'top' //內聯樣式最高級
// }
},
'css-loader',
'postcss-loader'
]
},
{
test: /\.less$/,
use: [
{
loader: 'style-loader',
},
'css-loader',
'postcss-loader',
'less-loader'
]
}
複製代碼
npm i babel-loader @babel/core @babel/preset-env -D
npm i @babel/plugin-proposal-class-properties -D
複製代碼
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: { // 用babel-loader 須要把es6-es5
presets: [
'@babel/preset-env'
],
plugins: [
'@babel/plugin-proposal-class-properties'
]
}
}
]
複製代碼
npm i jquery -D
npm i expose-loader -D
複製代碼
rules: [
{
test: require.resolve('jquery'),
use: 'expose-loader?$'
},
]
複製代碼
const webpack = require('webpack');
plugins: [ // 數組放着全部的webpack插件
new webpack.ProvidePlugin({
$: 'jquery' // 在每一個模塊中注入$對象
})
],
複製代碼
// 1.在js中建立圖片來引入
// 2.在css引入backgroud('url')
// 3.<img src="" alt="" />>
npm i file-loader -D
npm i html-withimg-loader -D
複製代碼
rules: [
{
test: /\.html$/,
use: 'html-withimg-loader'
},
{
test: /\.(png|jpg|gif)$/,
use: 'file-loader'
},
]
複製代碼
npm i url-loader -D
複製代碼
{
test: /\.(png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 200*1024
}
}
複製代碼
plugins: [ // 數組放着全部的webpack插件
new MiniCssExtractPlugin({
filename: 'css/main.css'
}),
],
{
test: /\.(png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 1,
outputPath: '/img/',
publicPath: 'https://www.baidu.com' // 在圖片上加域名
}
}
複製代碼
console.log("other 一路走好!")
複製代碼
// 多入口
entry: {
index: './src/index.js',
home: './src/other.js',
},
output: {
filename: '[name].js', //打包後的文件名
path: path.resolve(__dirname, 'dist'), //路徑必須是一個絕對路徑
// publicPath: 'https://www.baidu.com'
},
plugins: [ // 數組放着全部的webpack插件
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
chunks: ['index']
}),
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'home.html',
chunks: ['home']
}),
]
複製代碼
output: {
filename: '[name].js', //打包後的文件名
path: path.resolve(__dirname, 'dist'), //路徑必須是一個絕對路徑
// publicPath: 'https://www.baidu.com'
},
// devtool: 'source-map', // 1.增長映射文件 能夠幫咱們調試源代碼
// devtool: 'eval-source-map', // 2.不會產生單獨的文件,可是能夠顯示行和列
// devtool: 'cheap-module-source-map', // 3.不會產生列,可是是一個單獨的映射文件(產生後你能夠保留起來)
devtool: 'cheap-module-eval-source-map',// 4.不會長生文件,集成在打包後的文件中不會產生列
複製代碼
entry: {
index: './src/index.js',
home: './src/other.js',
},
watch: true,
watchOptions: { // 監控的選項
poll: 1000, // 每秒問我1000次
aggregateTimeout: 500, // 防抖
ignored: /node_modules/ // 不須要進行監控哪一個文件
},
複製代碼
npm i clean-webpack-plugin -D
npm i copy-webpack-plugin -D
複製代碼
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
plugins: [
new CleanWebpackPlugin(),
new CopyWebpackPlugin([
{from: 'doc', to: './'}
]),
new webpack.BannerPlugin('cl by 2019')
],
複製代碼
npm i express -D
複製代碼
let express = require('express');
let app = express();
app.get('/user', (req, res)=> {
res.json({ name: "xiaolin3333" })
})
app.listen(3000);
複製代碼
devServer: { // 開發服務器的配置
// 1)http:proxy
proxy: {// 從新的方式 把請求代理到express服務器!
'/api': {
target: 'http://localhost:3000',
pathRewrite: {'/api': ''}
} // 配置了一個代理
}
},
複製代碼
let xhr = new XMLHttpRequest();
xhr.open('GET', '/api/user', true);
xhr.onload = function() {
console.log(xhr.response,);
}
xhr.send();
複製代碼
devServer: { // 開發服務器的配置
// 2)前端只想單純來模擬數據
before(app) { // 提供的方法 鉤子
app.get('/user', (req, res)=> {
res.json({ name: "xiaolinwww" })
})
}
複製代碼
let xhr = new XMLHttpRequest();
xhr.open('GET', '/user', true);
xhr.onload = function() {
console.log(xhr.response,);
}
xhr.send();
複製代碼
npm i webpack-dev-middleware -D
複製代碼
let express = require('express');
let app = express();
let webpack = require('webpack');
// 中間件
let middle = require('webpack-dev-middleware');
let config = require('./webpack.config');
let compiler = webpack(config);
app.use(middle(compiler));
app.get('/user', (req, res)=> {
res.json({ name: "xiaolin3333-webpack-dev-middleware" })
})
app.listen(3000);
複製代碼
let xhr = new XMLHttpRequest();
xhr.open('GET', '/user', true);
xhr.onload = function() {
console.log(xhr.response,);
}
xhr.send();
複製代碼
yarn add css-loader style-loader -D
複製代碼
import './style';
style.css
body{
background-color:green;
transform: rotate(90deg);
}
複製代碼
resolve: {// 解析第三方包 common
modules: [path.resolve('node_modules')],
extensions: ['.js','.css','.vue']
// alias: { // 別名 vue vue.runtime
// bootstrap: 'bootstrap/dist/css/bootstrap.css'
// },
// mainFields: ['style', 'main']
// mainFields: [],// 入口文件的名字index.js
},
module: { //模塊
rules: [
{
test: /\.css$/,
use: ['style-loader','css-loader']
},
]
}
複製代碼