ä»é¶å¼å§æå»ºä¸ä¸ªç®åçåºäºwebpackçvueå¼åç¯å¢
é½8102å¹´äºï¼ç°å¨è¿æ¥è°webpackçé ç½®ï¼é¢ï¼æ¯æç¹æäºãèä¸ï¼åºäºvue-cliæè create-react-appçæç项ç®ï¼ä¹å·²ç»ä¸é®ä¸ºæä»¬é 置好äºwebpackï¼çèµ·æ¥ä¼¼ä¹å¹¶ä¸éè¦æä»¬æ·±å ¥äºè§£ã
ä¸è¿ï¼ä¸ºäºå¦ä¹ åçè§£webpackè§£å³äºå端çåªäºçç¹ï¼è¿æ¯æå¿
è¦ä»é¶å¼å§èªå·±æå»ºä¸ä¸ªç®åçå¼åç¯å¢ãæ¬æçwebpacké
ç½®åèäºvue-cliæä¾webpack-simple
模æ¿ï¼è¿ä¹æ¯vue-clié颿ç®åçä¸ä¸ªwebpacké
ç½®ï¼é常éåä»é¶å¼å§å¦ä¹ ã
æ³¨ï¼ æ¬æwebpackåºäº3.10.0ï¼ webpack4é¨åå 容å¯è½ä¸åéç¨ï¼ï¼ï¼ï¼
æ¼ç¤ºä»£ç ä¸è½½
å®è£ webpack
npm i webpack -g
webpack4è¿è¦åç¬å®è£
npm i webpack-cli -g
项ç®åå§å
æ°å»ºä¸ä¸ªæä»¶å¤¹vue-webpack-simple
æ°å»ºpackage.json
npm init -y
å®è£ vue webpack webpack-dev-server
npm i vue --save
npm i webpack webpack-dev-server --save-dev
æ ¹ç®å½ä¸æ°å»º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>
</body>
</html>
æ ¹ç®å½ä¸æ°å»ºwebpack.config.js
var path = require('path');
var webpack = require('webpack');
module.exports = {};
æ°å»ºsrcæä»¶å¤¹ï¼srcæä»¶å¤¹ä¸æ°å»ºmain.js
ç®åæ´ä¸ªé¡¹ç®çç»æå¦ä¸:
js模åå
å¨ES6åºç°ä¹åï¼jsæ¯æ²¡æç»ä¸ç模åä½ç³»ã
æå¡å¨ç«¯ä½¿ç¨CommonJSè§è,èæµè§å¨ç«¯åæAMDåCMD两ç§è§è
webpackçææ³å°±æ¯ä¸åçæ¨¡åï¼å®æ¹æ¨è使ç¨commonJSè§èï¼è¿ä½¿å¾æä»¬æµè§å¨ç«¯ä¹å¯ä»¥ä½¿ç¨commonJSçæ¨¡åååæ³
module.exports = {}
srcç®å½ä¸æ°å»ºä¸ä¸ªutil.js
module.exports = function say() {
console.log('hello world');
}
main.js
var say = require('./util');
say();
ä¿®æ¹webpack.config.js
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: './src/main.js', // 项ç®çå
¥å£æä»¶ï¼webpackä¼ä»main.jså¼å§ï¼æææä¾èµçjsé½å è½½æå
output: {
path: path.resolve(__dirname, './dist'), // 项ç®çæå
æä»¶è·¯å¾
publicPath: '/dist/', // éè¿devServer访é®è·¯å¾
filename: 'build.js' // æå
åçæä»¶å
},
devServer: {
historyApiFallback: true,
overlay: true
}
};
ä¿®æ¹package.josn
"scripts": {
"dev": "webpack-dev-server --open --hot",
"build": "webpack --progress --hide-modules"
},
注æï¼webpack-dev-serverä¼èªå¨å¯å¨ä¸ä¸ªéæèµæºwebæå¡å¨ --hotåæ°è¡¨ç¤ºå¯å¨çæ´æ°
ä¿®æ¹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>
<script src="/dist/build.js"></script>
</body>
</html>
è¿è¡
npm run dev
å¯ä»¥åç°æµè§å¨èªå¨æå¼çä¸ä¸ªé¡µé¢ï¼æ¥çæ§å¶å°ï¼æhello world
æåº
æä»¬éæä¿®æ¹util.jsï¼å¯ä»¥åç°æµè§å¨ä¼èªå¨å·æ°ï¼é常æ¹ä¾¿ã
妿æä»¬å¸æçæå åçbundle.jsæä»¶ï¼è¿è¡
npm run build
å¯ä»¥çå°çæäºä¸ä¸ªdistç®å½ï¼éé¢å°±ææå
好åçbundle.js
webpacké»è®¤ä¸æ¯æè½¬ç es6ï¼ä½æ¯import
export
è¿ä¸¤ä¸ªè¯æ³å´åç¬æ¯æãæä»¥æä»¬å¯ä»¥æ¹ååé¢ç模åååæ³
util.js
export default function say() {
console.log('hello world ');
}
main.js
import say from './util';
say();
å¼å ¥vue
ä¸é¢æä»¬æ¥è¯çå¼å ¥vue(ç®åä¸èèåæä»¶.vue)
main.js
import Vue from 'vue';
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
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="app">
{{message}}
</div>
<script src="/dist/build.js"></script>
</body>
</html>
è¿è¦æ³¨æä¸ç¹ï¼è¦ä¿®æ¹webpack.config.jsæä»¶
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js'
},
devServer: {
historyApiFallback: true,
overlay: true
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
}
};
éæ°è¿è¡npm run devï¼å¯ä»¥çå°ï¼é¡µé¢æ£å¸¸æ¾ç¤ºäºHello World
å¼å ¥scssåcss
webpacké»è®¤åªæ¯æjsçæ¨¡ååï¼å¦æéè¦æå ¶ä»æä»¶ä¹å½ææ¨¡åå¼å ¥ï¼å°±éè¦ç¸å¯¹åºçloaderè§£æå¨
npm i node-sass css-loader vue-style-loader sass-loader --save-dev
webpack.config.js
var path = require('path');
var webpack = require('webpack');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js'
},
devServer: {
historyApiFallback: true,
overlay: true
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
module: {
rules: [
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
}
]
}
};
è§£éï¼
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
}
è¿æ®µä»£ç æææ¯ï¼å¹é
åç¼å为cssçæä»¶,ç¶ååå«ç¨css-loaderï¼vue-style-loaderå»è§£æ
è§£æå¨çæ§è¡é¡ºåºæ¯ä»ä¸å¾ä¸(å
css-loaderåvue-style-loader)
注æï¼å 为æä»¬è¿éç¨vueå¼åï¼æä»¥ä½¿ç¨vue-style-loaderï¼å ¶ä»æ åµä½¿ç¨style-loader
css-loaderä½¿å¾æä»¬å¯ä»¥ç¨æ¨¡ååçåæ³å¼å ¥css,vue-style-loaderä¼å°å¼å ¥çcssæå ¥å°html页é¢éçstyleæ ç¾é
è¦å¼å ¥scss乿¯åççé ç½®åæ³:
module: {
rules: [
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
},
{
test: /\.scss$/,
use: [
'vue-style-loader',
'css-loader',
'sass-loader'
],
},
{
test: /\.sass$/,
use: [
'vue-style-loader',
'css-loader',
'sass-loader?indentedSyntax'
],
}]
}
æä»¬ç°å¨æ¥è¯ä¸
å¨srcç®å½ä¸æ°å»ºstyleç®å½ï¼styleç®å½éæ°å»ºcommon.scss
body {
background: #fed;
}
main.js
import './style/common.scss';
åç°cssæ ·å¼æç¨äº
使ç¨babel转ç
ES6çè¯æ³å¤§å¤æ°æµè§å¨ä¾æ§ä¸æ¯æ,bableå¯ä»¥æES6è½¬ç æES5è¯æ³ï¼è¿æ ·æä»¬å°±å¯ä»¥å¤§èçå¨é¡¹ç®ä¸ä½¿ç¨ææ°ç¹æ§äº
npm i babel-core babel-loader babel-preset-env babel-preset-stage-3 --save-dev
å¨é¡¹ç®æ ¹ç®å½æ°å»ºä¸ä¸ª.babelrcæä»¶
{
"presets": [
["env", { "modules": false }],
"stage-3"
]
}
webpack.config.jsæ·»å ä¸ä¸ªloader
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
}
exclude表示忽ç¥node_modulesæä»¶å¤¹ä¸çæä»¶ï¼ä¸ç¨è½¬ç
ç°å¨æä»¬æ¥è¯ä¸async awaitè¯æ³å§
util.js
export default function getData() {
return new Promise((resolve, reject) => {
resolve('ok');
})
}
main.js
import getData from './util';
import Vue from 'vue';
import './style/common.scss';
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
},
methods: {
async fetchData() {
const data = await getData();
this.message = data;
}
},
created() {
this.fetchData();
}
});
è¿æ¶æ§å¶å°ä¼æ¥ä¸ä¸ªé误regeneratorRuntime is not defined
ï¼å 为æä»¬æ²¡æå®è£
babel-polyfill
npm i babel-polyfill --save-dev
ç¶åä¿®æ¹webpack.config.jsçå ¥å£
entry: ['babel-polyfill', './src/main.js'],
éæ°npm run devï¼å¯ä»¥åç°æ£å¸¸è¿è¡äº
å¼å ¥å¾çèµæº
æå¾çä¹å½ææ¨¡åå¼å ¥
npm i file-loader --save-dev
webpack.config.jsæ·»å ä¸ä¸ªloader
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
å¨srcç®å½ä¸æ°å»ºä¸ä¸ªimgç®å½ï¼åæ¾ä¸å¼ å¾çlogo.png
ä¿®æ¹main.js
import getData from './util';
import Vue from 'vue';
import './style/common.scss';
Vue.component('my-component', {
template: '<img :src="url" />',
data() {
return {
url: require('./img/logo.png')
}
}
})
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue !'
},
methods: {
async fetchData() {
const data = await getData();
this.message = data;
}
},
created() {
this.fetchData()
}
});
ä¿®æ¹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="app">
{{message}}
<my-component/>
</div>
<script src="/dist/build.js"></script>
</body>
</html>
å¯ä»¥çè§ï¼å¾çä¹è¢«æ£ç¡®å è½½äº
åæä»¶ç»ä»¶
å¨åé¢çä¾åéï¼æä»¬ä½¿ç¨ Vue.component æ¥å®ä¹å
¨å±ç»ä»¶
å¨å®é
项ç®éï¼æ´æ¨è使ç¨åæä»¶ç»ä»¶
npm i vue-loader vue-template-compiler --save-dev
æ·»å ä¸ä¸ªloader
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
'scss': [
'vue-style-loader',
'css-loader',
'sass-loader'
],
'sass': [
'vue-style-loader',
'css-loader',
'sass-loader?indentedSyntax'
]
}
}
}
å¨srcç®å½ä¸æ°å»ºä¸ä¸ªApp.vue
<template>
<div id="app">
<h1>{{ msg }}</h1>
<img src="./img/logo.png">
<input type="text" v-model="msg">
</div>
</template>
<script>
import getData from './util';
export default {
name: 'app',
data () {
return {
msg: 'Welcome to Your Vue.js'
}
},
created() {
this.fetchData();
},
methods: {
async fetchData() {
const data = await getData();
this.msg = data;
}
}
}
</script>
<style lang="scss">
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
h1 {
color: green;
}
}
</style>
main.js
import Vue from 'vue';
import App from './App.vue';
import './style/common.scss';
new Vue({
el: '#app',
template: '<App/>',
components: { App }
})
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="app"></div>
<script src="/dist/build.js"></script>
</body>
</html>
npm run devï¼å¯ä»¥åç°åæä»¶è¢«æ£ç¡®å è½½äº
source-map
å¨å¼åé¶æ®µï¼è°è¯ä¹æ¯é常éè¦çä¸é¡¹éæ±ã
App.vue
created() {
this.fetchData();
console.log('23333');
}
æä»¬æ
ææä¸ä¸ªconsoleï¼æå¼æ§å¶å°
æä»¬ç¹å»è¿å
¥è¿ä¸ªconsoleç详ç»å°å
è¿å ¥çæ¯æå åçbuild.jsï¼æå¹¶ä¸ç¥éæ¯å¨åªä¸ªç»ä»¶éåçï¼è¿å°±é æäºè°è¯å°é¾
è¿æ¶å°±è¦ä¿®æ¹webpack.config.js
module.exports = {
entry: ['babel-polyfill', './src/main.js'],
// çç¥å
¶ä»...
devtool: '#eval-source-map'
};
éæ°npm run dev
è¿æ¬¡è°è¯ï¼å®ç´æ¥è¿åé£ä¸ªç»ä»¶çæºä»£ç äºï¼è¿ä¸æ¯è¢«æå
è¿çï¼
æå åå¸
æä»¬å
è¯çnpm run buildæå
ä¸ä¸æä»¶
ä¼åç°ï¼æå åçbuild.jséå¸¸å¤§ï¼æ500å¤käº
å¨å®é å叿¶ï¼ä¼å¯¹æä»¶è¿è¡å缩ï¼ç¼åï¼å离ççä¼åå¤ç
npm i cross-env --save-dev
ä¿®æ¹package.json
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
}
è¿æ¬¡æä»¬è®¾ç½®äºç¯å¢åéï¼æå æ¶ï¼NODE_ENVæ¯production
ç¶åä¿®æ¹webpack.config.jsï¼å¤æNODE_ENV为productionæ¶ï¼å缩js代ç
var path = require('path');
var webpack = require('webpack');
module.exports = {
// çç¥...
}
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map';
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin(),
])
}
éæ°æå
å¯ä»¥çè§ï¼å缩ææéå¸¸ææ¾ï¼
è³æ¤ï¼ä¸ä¸ªé常ç®åçvueå¼åç¯å¢æå»ºæåã
注æï¼æ¬æä¸çé ç½®è¿æé常å¤å¯ä»¥ä¼åçå°æ¹ï¼æ¯å¦å离jsåcss
读è å¯ä»¥èªè¡äºè§£ç¸å ³ç¥è¯ï¼è¿éåªæ¯å¸¦é¢å¤§å®¶äºè§£æåºç¡çwebpacké ç½®ã
转èªï¼https://segmentfault.com/a/1190000012789253?utm_source=tag-newest