webpack是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序須要的每一個模塊,而後將全部這些模塊打包成一個或多個bundle。
css
webpack構建前端項目2html
新建項目 npm init -y 生成package.json 文件;vue
npm init -y複製代碼
安裝 webpack 和 webpack-clinode
npm i webpack webpack-cli -D複製代碼
在文件根目錄新建一個 webpack.config.js 文件,新建src目錄,在 src目錄下新建main.js做爲入口文件。webpack.config.js代碼以下webpack
const path=require('path')
module.exports={
entry:path.resolve(__dirname,'src/main.js'), //入口文件
output:{ //輸出文件
filename:'index.js',
path:path.resolve(__dirname,'dist')
}}複製代碼
入口文件若是不寫,默認是src目錄下的index.js文件,在 package.json 文件中 加入腳本啓動
ios
"scripts": {
"build":"webpack"
}複製代碼
在命令行輸入 npm run build ,可看到 dist目錄下生成了 index.js。git
webpack在處理各類類型的資源時,需用到各資源的loader es6
處理圖片資源使用 file-loader url-loader,在命令行輸入github
npm i file-loader url-loader -D複製代碼
webpack.config.js中添加
module.exports = {
entry: path.resolve(__dirname, 'src/main.js'),
output: {
filename: 'index.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [{
test: /\.(jpe?g|png|gif|svg)(\?.*)?$/,
use: [{
loader: "url-loader",
options: {
limit: 10000,
filename: '[name].[hahs:5].[ext]',
outputPath: 'imgs/'
}
}]
}]
}}
複製代碼
limit選項將小於此大小的圖片轉換爲base64,以base64字符串形式內聯進項目中;outputPath是打包後的圖片所在的目錄。
應用babel-loader把es6 7語法轉換成瀏覽器支持度高的es5語法,參考小諾哥的作法:
npm i babel-loader @babel/core @babel/preset-env @babel/runtime @babel/plugin-transform-runtime -D複製代碼
webpack.config.js 中添加
module.exports = {
module: {
rules: [
...
{
test: /\.js$/,
exclude: /node_modules/,
use: ['babel-loader?cacheDirectory']
}
]
}}
複製代碼
在文件更目錄下新建 .babelrc 文件
{
"presets": [
["@babel/preset-env"]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs": false,
"helpers": true,
"regenerator": true,
"useESModules": false,
"absoluteRuntime": "@babel/runtime"
}
]
]}
複製代碼
命令行安裝
npm i style-loader css-loader less less-loader複製代碼
webpack.config.js 中添加
module.exports = {
entry: path.resolve(__dirname, 'src/main.js'),
output: {
filename: 'index.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
...
{
test: /\.(le|c)ss$/,
use: ['style-loader', 'css-loader', 'less-loader']
}
]
}}
複製代碼
use 的處理順序是右往左處理 對css、less 文件依次進行處理,
命令行輸入
npm i vue vue-loader vue-style-loader vue-template-compiler -D複製代碼
在webpack.config.js中的插件中引入vuePlugin; vue-style-loader替換掉style-loader:
const vuePlugin = require('vue-loader/lib/plugin')
module.exports = {
...
module: {
rules: [
....
{
test: /\.(le|c)ss$/,
use: ['vue-style-loader', 'css-loader', 'less-loader']
},
{
test: /\.vue$/,
use: ['vue-loader']
}
]
},
plugins: [new vuePlugin()]
}複製代碼
在src 下 新建一個app.vue文件,
<template>
<h1>hello world</h1></template>
<script>
export default {}
</script>
<style></style>
複製代碼
在src/main.js中引入 app.vue 建立 vue對象
import App from './app'import Vue from 'vue'
let ele = document.createElement('div')
ele.id = 'root'document.body.appendChild(ele)
new Vue({
el: '#root',
render: h => h(App)
})
複製代碼
運行 npm run build生成 打包後的 index.js ,新建一個html文件,script引入 index.js便可在瀏覽器中查看效果
插件是 webpack 的支柱功能,插件目的在於解決 loader 沒法實現的其餘事
用 clean-webpack-plugin 能夠自動清除output打包的目錄,不用本身手動清理
npm i clean-webpack-plugin -D複製代碼
在webpack.config.js中
const { CleanWebpackPlugin} = require('clean-webpack-plugin')
module.exports = {
...
plugins: [
...
new CleanWebpackPlugin()
]}複製代碼
用html-webpack-plugin能夠在打包的目錄生成一個html文件,並在html中自動引入打包好的js、css等文件
npm i html-webpack-plugin -D複製代碼
新建目錄template,在tempalte目錄中新建template.html文件做爲模板文件。
在webpack.config.js中
const htmlPlugin=require('html-webpack-plugin')
module.exports={
...
plugins:[
...
new htmlPlugin({
template:'template/template.html'
})
]
}複製代碼
配置了webpack.resolve.extensions,在引入文件時,自動補全文件的後綴名。webpack.resolve.alias配置路徑別名。
const res = (p) => path.join(process.cwd(), p);
module.exports = {
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': res('src'),
'@style': res('src/common/style'),
'@js': res('src/common/js'),
'@mock': res('mock'),
'@component': res('src/component')
}
},
externals: {
'axios': 'axios'
}}
複製代碼
配置在externals中的項目,webpack在打包時會進行過濾,通常用於cdn加速