这里将介绍如何从零开始搭建一套包含调试,构建的vue脚手架,其中主要是对webpack的学习,以及如今一些经常使用的集成在脚手架中前端功能的使用好比:babel,代码压缩,代码热更新等等。本文适合掌握了前端基础以及vue相关知识的程序猿观看学习,最主要的是要有颗热爱这个行业的心(滑稽),也请各位大神指教指教,不喜勿喷,若是对你起到了一丝丝的帮助也请给咱点个赞~javascript
安装webpack以及webpack-cli(使用webpack必须的依赖)css
npm i webpack webpack-cli
复制代码
安装webpack-dev-server(用于调试,热更新等)html
npm i webpack-dev-server
复制代码
新建package.json前端
npm init -y
复制代码
新建index.htmlvue
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue-cli-simple</title>
</head>
<body>
</body>
</html>
复制代码
新建src目录而且新建main.js用于作入口文件java
在根目录新建webpack.config.js用于webpack配置node
module.exports = {};
复制代码
最终项目结构为webpack
首先在main.js中写入es6
alert('这是一个页面')
复制代码
接着将webpack配置文件webpack.config.js更改web
const path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'app.js'
},
devServer: {
historyApiFallback: true,
overlay: true
}
};
复制代码
entry:要打包的js文件
path:最后生成文件的路径
publicPath:使用调试模式时文件的位置
filename:最后生成的文件名
最后修改index.html引入打包好的js,因为path,publicPath咱们写的是相同的因此这边咱们只要用/dist/app.js就都能访问(无论是调试模式仍是最后打包出来)
index.html加上
<script src="/dist/app.js"></script>
复制代码
最后改动package.json加入调试以及打包的命令
"scripts": {
"serve": "webpack-dev-server --open --hot",
"build": "webpack --progress --hide-modules"
}
复制代码
运行 npm run serve
运行 npm run build
首先babel咱们知道是用来适配新语法的因此咱们修改main.js,加入一些语法,如箭头函数,let
let babelTest= ()=>{
alert('这里是babelTest方法')
}
babelTest()
复制代码
运行后能够找到app.js
npm install babel-loader @babel/core @babel/preset-env babel-polyfill
复制代码
在根目录建立.babelrc文件(用于配置),如今咱们先放空
{}
复制代码
接着在改动webpack.config.js中加入
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
复制代码
简单介绍一下这边的rules,webpack在进行编译的时候会读取rules选项,并根据里面的配置处理文件。
test说明须要处理的文件类型,exclude是要忽略的文件,use中就是处理的方法。
这里的配置就是处理全部的js文件,可是忽略全部node_modules中的js,最后使用babel-loader去处理匹配到的js文件。
如今再次运行
npm install babel-polyfill
复制代码
把webpack.config.js的entry改一下
entry: ['babel-polyfill', './src/main.js']
复制代码
用es6中的async/await试一下,改动main.js
function sendMes() {
return new Promise((resolve, reject) => {
resolve('这里是数据');
})
}
async function getData(){
const data = await sendMes();
console.log(data)
}
getData()
复制代码
运行后
安装vue
npm install vue
复制代码
改动main.js
import Vue from 'vue';
var app = new Vue({
el: '#app',
data: {
message: '这里是vue'
}
复制代码
改动index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue-cli-simple</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script src="/dist/app.js"></script>
</body>
</html>
复制代码
运行
在webpack.config.js加入
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
}
复制代码
再次运行便可
安装依赖
npm i node-sass css-loader vue-style-loader sass-loader
复制代码
在src目录下新建一个styles文件夹并在其中新建common.css
body{
font-size: 30px;
}
复制代码
改动webpack.config.js
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
}
]
复制代码
这边咱们用了一个新的rule是关于css文件的处理,值得一提的是,若是use中有多个处理方法,那么会从下往上依此处理,这边就是先用css-loader加载css,再用vue-style-loader把加载好的样式加入近vue中。
修改main.js加入
import './styles/common.css';
复制代码
能够看到样式生效了
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
],
},
{
test: /\.scss$/,
use: [
'vue-style-loader',
'css-loader',
'sass-loader'
],
}
]
复制代码
styles中建立scssTest.scss
body{
div{
color: red;
}
}
复制代码
main.js中引入,再次运行便可看到效果
安装依赖
npm i vue-loader vue-template-compiler
复制代码
改动webpack.config.js加入一个针对.vue文件的loader
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
'scss': [
'vue-style-loader',
'css-loader',
'sass-loader'
]
}
}
}
复制代码
而且添加一个vueloader的插件,多说一句这里在vue-loader中又多加了一个针对scss的loader,使得咱们能够在vue文件中使用scss。
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
...
plugins: [
new VueLoaderPlugin()
]
...
}
复制代码
在src中新建App.vue
<template>
<div>
<p>{{ userInput }}</p>
<input v-model="userInput">
</div>
</template>
<script>
export default {
data(){
return{
userInput:'测试'
}
}
}
</script>
<style scoped lang="scss">
div{
p{
color: blue
}
}
</style>
复制代码
修改main.js
import Vue from 'vue';
import App from './App.vue';
import './styles/common.css';
import './styles/scssTest.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">
<title>vue-cli-simple</title>
</head>
<body>
<div id="app"></div>
<script src="/dist/app.js"></script>
</body>
</html>
复制代码
运行
咱们在日常的开发中遇到的报错后面都会有详细的信息,如错误行数等,方便咱们定位错误。而在webpack中输出的是编译事后的错误位置。如今咱们在App.vue中输出一个值。
export default {
data(){
return{
userInput:'测试'
}
},
mounted(){
console.log('测试')
}
}
复制代码
module.exports = {
...
devtool: '#eval-source-map'
...
}
复制代码
再次运行的话
执行打包命令 npm run build
压缩使用webpack中的UglifyJSPlugin插件便可
npm install uglifyjs-webpack-plugin
复制代码
修改webpack.config.js,再加入一个插件
const path = require('path');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
...
plugins: [
new UglifyJSPlugin(),
new VueLoaderPlugin()
]
...
}
复制代码
由于加入了错误调试的代码,咱们须要将上一步所加的东西去除,可是为了调试的时候有,打包的时候没有就须要加入一个环境变量,安装
npm i cross-env --save-dev
复制代码
cross-env用于改变环境
改动package.json
"scripts": {
"serve": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --mode production --progress --hide-modules"
}
复制代码
这样webpack.config.js就能够经过判断process.env.NODE_ENV来进行区别
改动webpack.config.js,在最后加上
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '';
}
复制代码
再次打包
了解了这简单版本的脚手架如何构建,总的来讲webpack给前端带来便利性,工程性是史无前例的, 虽然慢慢有更好的方案开始代替它,可是他的思想仍是值得咱们去学习的。固然cli的构建远没有这么简单,不过有了雏形以后一点点完善它也是一种乐趣所在吧。