webpack
Webpack — модульный инструмент управления, с помощью которого модули можно сжимать, предварительно обрабатывать, упаковывать по требованию, загружать по требованию и т. д.
четыре основные концепции
Вход Точка входа относится к тому, какой модуль веб-пакет должен использовать, чтобы начать построение своего внутреннего графа зависимостей. После входа в точку входа webpack узнает, какие модули и библиотеки (напрямую и косвенно) зависят от точки входа.вывод вывод Сообщает webpack, куда выводить созданные им пакеты и как называть эти файлы, по умолчанию ./dist. Вся структура приложения будет скомпилирована в папку, указанную вами в выходном пути.loader Загрузчики позволяют веб-пакету обрабатывать файлы, отличные от JavaScript (сам веб-пакет понимает только JavaScript). Загрузчики могут преобразовывать все типы файлов в действительные модули, которые может обрабатывать веб-пакет, а затем вы можете воспользоваться возможностями упаковки веб-пакета и обработать их.плагины Плагины варьируются от оптимизации упаковки и сжатия до переопределения переменных в среде. Интерфейс плагина чрезвычайно мощный и может использоваться для решения самых разных задач.
Среда сборки и конфигурация
базовая структура
Установить глобально
#全局安装 ( MAC 需要在 npm 前加 sodu )
npm install webpack -g
#全局安装webpack命令行接口
npm install webpack-cli -g
#全局安装一个小型的Node.js Express服务器
npm install webpack-dev-server -g
папка
#生成src文件夹
mkdir src config dist
инициализация
#初始化一个本地仓库,方便后期将代码上传到gitHub上
git init
#初始化(生成package.json)
npm init -y
папка/файл
touch src/index.js dist/index.html
окружающая обстановка
#打包自动生成dist文件夹,以及dist下main.js文件(mode是webpack4独有)
##开发环境下
webpack --mode=development
##生产环境下
webpack --mode=production
локальная установка
#局部安装(安装到开发环境)
npm install webpack webpack-cli webpack-dev-server
настроить
Базовая конфигурация
touch config/webpack.dev.js
rm dist/main.js src/index.js
touch src/main.js
#config/webpack.dev.js
const path = require("path")
module.exports = {
//入口(一个或多个)
entry:{
//main:["other.js","./src/main.js"]
main:"./src/main.js"
},
//打包环境:development & production
mode:"development",
//出口只有一个
output:{
filename: "[name].bundle.js",
path: path.resolve(__dirname,"../dist"),
//根路径
publicPath: "/"
}
}
#打包
webpack --config=config/webpack.dev.js
#启动服务(Project is running at http://localhost:8080/)
webpack-dev-server --config=config/webpack.dev.js
Настройте package.json, чтобы упростить командную строку.
"start":"webpack-dev-server --config=config/webpack.dev.js", "build":"webpack --config=config/webpack.dev.js"
# package.json
{
"name": "mingx",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"dependencies": {
"webpack": "^4.8.3",
"webpack-cli": "^2.1.4",
"webpack-dev-server": "^3.1.4"
},
"devDependencies": {},
"scripts": {
"start":"webpack-dev-server --config=config/webpack.dev.js",
"build":"webpack --config=config/webpack.dev.js"
},
"author": "",
"license": "ISC"
}
#重启
npm start
#打包
npm run build
Настройте локальный сервер (установите страницу по умолчанию для содержимого в dist)
#config/webpack.dev.js
devServer:{
contentBase:"dist"
}
Загрузить CSS
#生成一个css文件
touch src/main.css
# dist/index.html
<div>hello</div>
<script src="main.bundle.js"></script>
#src/main.css
body{background-color:blueviolet;color:#fff;}
# src/main.js(引入css文件)
require("./main.css")
Скачать CSS-погрузчик
npm install style-loader css-loader
настроить загрузчики css
#config/webpack.dev.js
module:{
rules:[
//css loaders
{
test:/\.css$/,
use:["style-loader","css-loader"]
}
]
}
Перезапустите (пока документ webpack.config.js изменяется, вам необходимо перезапустить и обновить страницу) npm start
Информация об ошибке возвращается на терминал
Синхронизируйте информацию об ошибке со страницей http://localhost:8080/ (добавьте overlay:true в документ webapck.dev.js devServer)
#config/webpack.dev.js
devServer:{
contentBase:"dist",
overlay:true
}
загрузить html
#将dist文件夹下的index.html,引入src中
mv dist/index.html src/
# src/main.js
require("./main.css")
require("./index.html")
1. Загрузите html-загрузчик
npm install html-loader extract-loader file-loader
2. Настройте загрузчики html
# webpack.dev.js
{
test:/\.html$/,
use:["file-loader?name=[name].html","extract-loader","html-loader"]
//使用顺序从后往前
//1.html-loader找到html文件
//2.extract-loader将index.html跟生成的bundle.js进行分割
//3.file-loader为加载的文件起名字
}
##另外的的编译方式
{
test:/\.html$/,
use: [
{
loader: "file-loader",
option: {
name: "[name].html"
}
},
{
loader: "extract-loader"
},
{
loader: "html-loader"
}
]
}
#删除dist里面的文件
rm -rf dist/main.bundle.js dist/index.bundle.html
3. Упаковать и перезапустить
npm run build
npm start
Изображение загрузчика
#生成
mkdir src/images
1. Загрузите загрузчик URL
npm install url-loader
2. Настройте загрузчики изображений
#webpack.dev.js
{
//匹配到.jpg|png|svg|gif结尾的文件
test:/\.(jpg|png|svg|gif)$/,
//多个loader需要从后到前进行解析(大于10kb打包)
use:["url-loader?limit=10&name=images/[name]-[hash:8].[ext]"]
}
3. Упаковать и перезапустить
загрузить js
Преобразование JS с помощью Babel
# src/main.js
var a = () => {
console.log("one more time")
}
скачать
#安装babel-core
npm install babel-core
#生成.babelrc文件( babelrc文件的本质是json ,rc为自动加载的文件)
touch .babelrc
#下载库,将ES6转为ES5
npm install babel-plugin-transform-es2015-arrow-functions
Настройте файл .babelrc
#.babelrc
{
"plugins":[
"transform-es2015-arrow-functions"
]
}
#安装babel
sudo npm install babel-cli -g
#main.js使用babel
babel src/main.js
#安装babel-loader
npm install babel-loader
Настроить загрузчики JS
# webpack.dev.js
{
test:/\.js$/,
use:["babel-loader"],
//排除node_modules中的JS文件
exclude:/node_modules/
}
#删除dist里面的文件
rm -rf dist/main-bundle.js dist/index.html dist/images
#重新启动、打包
npm start
npm run build
Проверьте dist/main.bundle.js (есть ES6, разобранный на ES5)
Лучшее решение для синтаксиса JS: polyfill/preset/transform
# src/main.js
var a = async () => {
await console.log("one more time");
console.log('two')
}
#.babelrc
{
"plugins":[
"transform-es2015-arrow-functions",
"async-to-promises"
]
}
#将async转为promise
npm install babel-plugin-async-to-promises
#main.js使用babel
babel src/main.js
Полифил будет компилировать указанные вещи перед прекомпиляцией (недостаток: загрязнение сгенерированных переменных окружения)
#安装polyfill
npm install babel-polyfill
Настроить загрузчики JS
# webpack.dev.js
entry:{
main:["babel-polyfill","./src/main.js"]
}
Выберите соответствующий контент в babel-polyfill, чтобы преобразовать указанный синтаксис (обратите внимание на размер main.bundel.js).
entry:{
main:["core-js/fn/promise","./src/main.js"]
},
#比polyfill更好的方式:安装环境变量
npm install babel-preset-env
#.babelrc
{
"presets":[
"env",
{
"debug":true
}
]
}
#.babelrc
{
"presets":[
[
#配置环境自动下载对应的插件
"env",
{
"tartgets":{
#配置浏览器的版本号
"browsers":["last 2 versions"]
},
"debug":true
}
]
],
"plugins":[
#识别最新语法,解决环境污染
"transform-runtime"
]
}
#安装插件:transform-runtime
npm install babel-plugin-transform-runtime
# main.js
require("babel-runtime/regenerator")
require("./main.css")
require("./index.html")
var a = async args => {
const {a, b} = args
await console.log("one more time", a, b);
console.log('two')
}
a({a:12,b:23});
#main.js使用babel
babel src/main.js
строить леса
Отчеты об ошибках в реальном времени, рендеринг на стороне сервера и клиента в реальном времени...
#安装express
npm install express
#创建server文件夹用于启动服务
mkdir src/server
#创建入口文件和配置服务器的文件
touch src/server/main.js src/server/express.js
# package.json添加dev(用node启动main.js )
"dev":"node src/server/main.js"
# src/server/main.js
//将ES6转为ES5
require("babel-register")
//执行express文件
require("./express")
# src/server/express.js
//启动一个服务器
import express from 'express';
import path from 'path';
//创建服务器
const server = express()
//监听端口号 8080
server.listen(8080,() => {
console.log("server is running...")
})
Настроить стартовую страницу службы
#监听代码
npm install webpack-dev-middleware
# src/server/express.js
//启动一个服务器
import express from 'express';
import path from 'path';
//创建服务器
const server = express()
//配置启动路径
const staticMiddleware = express.static("dist")
//监听代码
const webpack = require("webpack")
const config = require("../../webpack.dev")
//使用webpack把config传进去作为实例
const compiler = webpack(config)
//使用下载的webpack-dev-middleware
const webpackDevMiddleware = require("webpack-dev-middleware")(compiler,config.devServer)
//【运行】server
server.use(webpackDevMiddleware)
// 【使用路径】
server.use(staticMiddleware)
//监听端口号 8080
server.listen(8080,() => {
console.log("server is running...")
})
npm run dev
Горячее обновление интерфейса
#配置热更新
npm install webpack-hot-middleware
# src/server/express.js //【使用热更新】在【运行】之后,【使用路径】之前
//热更新
const webpackHotMiddleware = require("webpack-hot-middleware")(compiler)
//【使用热更新】
server.use(webpackHotMiddleware)
Настроить горячее обновление
# webpack.dev.js
//引入webpack
const webpack = require('webpack');
//添加
module.exports = {
devServer:{
//热更新
hot:true,
},
//插件
plugins:[
new webpack.HotModuleReplacementPlugin()
]
」
# src/main.js
require("webpack-hot-middleware/client")
Горячее обновление серверной части
#安装全局的nodemon进行监听(后端)
sudo npm install nodemon -g
Настроить мониторинг
#package.json
"dev":"nodemon --watch config --watch src/server src/server/main.js"
Горячее обновление сервера
#服务端监听,安装插件
npm install html-webpack-plugin
Настроить горячее обновление серверной части
# webpack.dev.js
//引入html-webpack-plugin,并且生成实例
const HTMLWebpackPlugin = require("html-webpack-plugin");
//更改html loaders,去除和"html-webpack-plugin"插件功能中相同的部分
{
test: /\.html$/,
use:["html-loader"]
}
//插件
plugins:[
new webpack.HotModuleReplacementPlugin(),
//添加插件HTMLWebpackPlugin
new HTMLWebpackPlugin({
template:"./src/index.html"
})
]
# src/main.js
require("webpack-hot-middleware/client?reload=true")
Оптимизация проблемы повторной компиляции и динамического создания файлов при горячем обновлении
npm install webpack-mild-compile
# src/server/express.js
require("webpack-mild-compile")
Отладка с помощью webpack, node.js, браузера
#package.json
"dev":"nodemon --inspect --watch config --watch src/server src/server/main.js
вопрос:[nodemon] app crashed - waiting for file changes before starting... Решение: Я полагаюсь на интуицию изменил пункт порта SRC / Server / Express.js внутри прослушивания -_-!
React
npm install react react-dom
#创建react入口文件
touch src/app.js
#src/main.js
//引入babel文件解析ES6
require("babel-register");
//引入将react入口文件
require("./app");
#src/index.html
//添加根目录
<div id="react-root"></div>
#src/app.js
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<h1>Hi kiwi</h1>,
document.getElementById("react-root")
)
Разобрать jsx
Скачать babel-preset-реагировать
npm install babel-preset-react
Настройте babel-preset-реагировать
#.babelrc
{
"presets":[
[
"env",
{
"tartgets":{
"browsers":["last 2 versions"]
},
"debug":true
}
],
"babel-preset-react"
],
"plugins":[
"transform-runtime"
]
}
npm run dev
Sass
npm install node-sass sass-loader
touch src/main.sass
# main.js
require("./main.sass")
#config/webpack.dev.js
//sass
{
test: /\.sass$/,
use: ["style-loader", "css-loader","sass-loader"]
}
jQuery
npm install jquery
#config/webpack.dev.js
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery"
})
]
Bootstrap
npm install bootstrap
# main.js
import 'bootstrap/dist/css/bootstrap.css'
//需要先安装jquery 和 popper.js
import 'bootstrap/dist/js/bootstrap.js'
npm install popper.js
#config/webpack.dev.js
plugins: [
new webpack.ProvidePlugin({
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
'window.jQuery': 'jquery',
Popper: ['popper.js', 'default']
})
]