webpack是一個前端模塊化打包工具指(因爲模塊化開發,因此須要打包,這裏所說的
模塊化開發
主要指JS)
因爲現代前端應用程序愈來愈複雜,須要採用模塊化進行開發,但瀏覽器還未支持模塊化開發,因此webpack才誕生
webpack默認只支持js的模塊化(CommonJS/ES6/AMD),若是須要把其餘文件(css/圖片等)也當成模塊引入,就須要相對應的loader解析器
傳統前端的掛載點:html入口文件 (不管是js、css仍是圖片等資源都統一由html文件管理和調度) 現代前端的掛載點:js入口文件 (不管是js組件、css仍是圖片等資源都統一由js文件管理和調度,html文件做爲模板)
傳統前端:都是多頁面應用,無模塊化概念,所以無需打包工具 現代前端:能夠是單頁面應用,也能夠是多頁面應用,有模塊化概念,因爲歷史緣由,不少瀏覽器還不支持模塊化,故出現打包工具
傳統前端:在html文件,導入css資源使用<style>或<link>,導入js資源使用<script>,導入圖片資源使用url()或者<img src=""> 現代前端:在js中導入資源,使用import,在css中導入css資源,使用@import
使用NPM進行安裝,有2種方式:全局安裝、局部安裝(
局部又分爲生產局部安裝和開發局部安裝
)
全局安裝: npm i -g webpack 局部開發安裝: npm i -D webpack // (推薦此)JS應用在生產環境上不須要webpacke,因此無需使用生產局部安裝
局部安裝的項目,會在當前項目中node_module中,不會污染全局
v4.0.0以後,除了要安裝webpack,還須要安裝webpack-cli 局部開發安裝: npm i -D webpack-cli
在應用根目錄下,定義webpack.config.js文件 執行webpack時,直接在命令行輸入webpack (會默認尋找webpack.config.js配置文件)
在應用根目錄下,自定義webpack.config.dev.js文件 執行webpack時,直接在命令行輸入webpack --config webpack.config.dev.js 若是把webpack.config.dev.js配置文件放在根目錄下的文件夾裏呢?
const path = require('path'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, mode: 'development' };
全部打包好的JS文件,都要有一個html文件來引入,不然瀏覽器沒法瀏覽,這個功能就是webpack插件
HtmlWebpackPlugin
功能
一、安裝 npm install --save-dev html-webpack-plugin 二、在webpack.config.js文件中配置 const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, plugins: [ new HtmlWebpackPlugin({ filename: 'main.html' }) ], mode: 'development' };
webpack提供了一個用於開發使用的服務器:
webpack-dev-server
,前端應用開發,須要一個調試開發服務器來看即時效果
npm install webpack-dev-server --save-dev
一、配置執行服務器命令 在package.json中,配置 "scripts": { "sdev": "webpack-dev-server" } *****注意:默認服務器是讀取webpack.config.js文件,若是自定義了,須要加上--config webpack.config.dev.js***** 二、在webpack配置文件中配置 module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, plugins: [ new HtmlWebpackPlugin({ filename: 'main.html' }) ], mode: 'development', devServer: { open: true, // 自動開啓 contentBase: path.join(__dirname, 'dist'), index: 'main.html' } };
執行webpack,根據配置文件,會生成打包後的文件(硬盤) 執行webpack-dev-server,根據配置文件,會生成打包後的文件(內存),並啓動服務器
Babel 是一個 NodeJS的獨立應用
,用於把ES2015/ES2016/ES2017/React轉換成ES5用法:
一、在瀏覽器中使用
二、webpack打包中使用 (如下主要講解這種方式)
三、命令行直接使用css
npm install -D babel-loader @babel/core @babel/preset-env
在webpack中任何一個東西都稱爲模塊,js就不用說了。一個css文件,一張圖片、一個less文件都是一個模塊,都能用導入模塊的語法(commonjs的require,ES6的import)導入進來。webpack自身只能讀懂js類型的文件,其它的都不認識。可是webpack卻能編譯打包其它類型的文件,像ES六、JSX、less、typeScript等,甚至css、images也是Ok的,而想要編譯打包這些文件就須要藉助loader
import(導入)是ES6 Module的模塊化語法,與export(導出)是一對對應的技術,因此
*ES6 所說的導入都是導入 JS 文件*
,而這個JS文件通常會有導出語法
爲什麼webpack中能使用ES6 import語法導入CSS文件?
其實ES6 import語法沒有規定必定要導入JS文件,但若是你導入的是非JS文件,運行時會報錯的 webpack借用了ES6的導入/導出語法,自己就支持導入JS文件 若是須要轉ES5,須要額外配置一個loader 不一樣的是: webpack還支持導入別的文件(圖片、css、less等),語法也是借用了ES6的導入/導出語法,須要額外配置一個loader
npm i style-loader css-loader -D
const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'development', entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', template: './public/index.html' }) ], devServer: { open: true, contentBase: path.join(__dirname, 'dist'), index: 'index.html' }, module:{ rules:[{ test:/\.css$/, use: ['style-loader', 'css-loader'] //執行loader的前後順序是從右到左,必須先執行css-loader }] } };
理解 ['style-loader', 'css-loader'] 執行順序,就至關於
styleLoader( cssLoader( fileSource ) )
主要用於把.css文件的內容中@import/url()轉成js的導入語法import/require並執行,輸入的是.css文件內容,最後常常css-loader加載器處理後,獲得的是css代碼字符串
主要用於把css-loader處理後的css代碼字符串添加到頁面head內<style>中,可是經過js動態添加進去的