webpack的应用很普遍,就算不深刻使用,仍是须要了解一番的。
本文并无详细描述每一步的安装组件步骤和一些概念等,由于webpack官网已经写得很详细了,网上学习webpack的文档也有不少,可是我在学习的过程当中,没有找到vue和webpack结合来说的文档,而且学习配置中也遇到了不少问题,所以,本文旨在记录完整的配置,以及遇到的一些bugcss
webpack 官网:www.webpackjs.com/
vue 官网: cn.vuejs.org/html
npm install --save-dev webpack // 安装最新的webpack
npm install --save-dev webpack-cli // 安装webpack-cli
npm init // 初始化项目
复制代码
初始化项目的时候,根据提问本身选择相应的选项,在初始化结束以后,项目里会有 package.json 文件 vue
默认的webpack配置文件名称为 webpack.config.js ,但通常都会进行环境分离,因此删除 webpack.config.js,新建如下三个文件,分别为公用环境、开发环境、生产环境 node
在package.json中添加指定的运行指令,并使用set NODE_ENV= 为当前环境设置别名,须要注意的是,set NODE_ENV=XXName 的 XXName先后不能有空格,否则空格会包含到当前环境名称中webpack
"scripts": {
"build": "set NODE_ENV=production&& webpack --config webpack.prod.js", // 设置生产环境运行指令为 npm build,生产环境名称为production,生产环境配置文件为webpack.prod.js(下同)
"start": "set NODE_ENV=development&& webpack-dev-server --open --config webpack.dev.js"
},
复制代码
const path = require('path'); // 定义当前路径
const VueLoaderPlugin = require('vue-loader/lib/plugin') // 添加vue-loader
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 提取独立的css文件
module.exports = {
entry: {
app: './src/main.js', // 入口文件
},
// 路径别名--在vue文件中,能够直接使用@或static缩写路径
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': path.resolve(__dirname, 'src'),
static: path.resolve(__dirname, 'static')
}
},
// 引入插件
plugins: [
new VueLoaderPlugin(), // 引入vue-loader
new MiniCssExtractPlugin({
filename: 'static/style/style.css'
}),
],
// bundle输出,这里也能够分开写在开发环境和生产环境中
output: {
filename: process.env.NODE_ENV === 'production' ? 'static/js/[name].[chunkhash].js' : 'static/js/[name].[hash].js', // chunkhash不可与热更新一块儿使用,开发环境使用了热更新,因此须要区分开发和生产环境
chunkFilename: '[name].bundle.js', // 决定非入口 chunk 的名称
path: path.resolve(__dirname, 'dist'),
publicPath: process.env.NODE_ENV === 'production' ? './' : '/'
},
// 规则配置
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
// 它会应用到普通的 `.js` 文件
// 以及 `.vue` 文件中的 `<script>` 块
{
test: /\.js$/,
use: [
'babel-loader'
],
// 排除node_modules内的转译
exclude: file => (
/node_modules/.test(file) && !/\.vue\.js/.test(file)
)
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
limit: 10240,
name:"static/imgs/[name].[ext]", // 输出的文件名
esModule: false
}
}
],
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/,
use: [
{
loader: 'file-loader',
options: {
limit: 10240,
name:"static/fonts/[name].[ext]",
esModule: false
}
}
]
},
// 提取css
{
test: /\.css$/,
use: [
process.env.NODE_ENV !== 'production'
? 'vue-style-loader'
: MiniCssExtractPlugin.loader,
'css-loader',
],
},
{
test: /\.less$/,
use: [
process.env.NODE_ENV !== 'production'
? 'vue-style-loader'
: MiniCssExtractPlugin.loader,
'css-loader',
'less-loader',
]
},
]
},
};
复制代码
// 合并配置文件
const merge = require('webpack-merge')
const common = require('./webpack.common.js')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = merge(common, {
devtool: 'inline-source-map', // 输出报错
// 热更新
devServer: {
hot: true,
contentBase: './src/main.js',
host: 'localhost'
},
plugins: [
//浏览器预览页面
new HtmlWebpackPlugin({
title: 'development',
filename: 'index.html',
template: 'index.html'
}),
new webpack.NamedModulesPlugin(), // 查看要修补(patch)的依赖-查看更改的文件
new webpack.HotModuleReplacementPlugin()
],
})
复制代码
// 生产环境
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const TerserPlugin = require('terser-webpack-plugin'); // 压缩js
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 生成浏览器预览页面
module.exports = merge(common, {
devtool: 'source-map', // 生产环境的报错信息
mode: 'production', // 压缩输出
plugins: [
// 清空dist文件里的内容
new CleanWebpackPlugin(),
// 提供生成的index.html模板
new HtmlWebpackPlugin({
title: 'productionPage',
template: 'index.html',
}),
],
optimization: {
// 压缩js
minimize: true,
minimizer: [
new TerserPlugin({
test: /\.js(\?.*)?$/i,
})
],
// 分离压缩代码-此分离了vue的源码,项目代码单独生成一个js文件
splitChunks: {
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'static/js/vendors',
chunks: 'initial'
}
}
}
},
});
复制代码
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}]
],
"plugins":[]
}
复制代码
import Vue from 'vue'
import App from './App.vue'
export const vue = new Vue({
render: (h) => h(App)
}).$mount('#app')
复制代码
<template>
<div id="app" class="container">
<img src="./assets/img/page.png">
<img :src="imgs" alt="">
<img :src="imgs2" alt="">
<p class="p-test">{{ greeting }} world!ddd!!</p>
<home></home>
</div>
</template>
<script>
import imgs from '@/assets/img/page.png'
import imgs2 from 'static/img/finger.png'
import home from '@/pages/home'
export default {
name: 'App',
components: { home },
props: {},
data() {
return {
imgs: imgs,
imgs2: imgs2,
greeting: "Hello",
};
},
computed: {},
watch: {},
created() {
},
mounted() {},
methods: {},
}
</script>
<style lang="less">
@import 'static/style/common.less';
.container{
.p-test{
color: red
}
}
</style>
复制代码
npm install --save lodash // 用于打包 lodash 依赖
npm install --save-dev style-loader css-loader // 加载CSS
npm install --save-dev file-loader // 加载图片、字体等
npm install --save-dev html-webpack-plugin // 每次打包生成一个HTML文件,将全部的 bundle 自动添加到 html 中
npm install clean-webpack-plugin --save-dev // 清理dist文件夹
npm install --save-dev webpack-dev-server // 代码发生变化后自动编译代码
npm install --save webpack-merge // 分离代码,区分生产环境和开发环境
npm install --save uglifyjs-webpack-plugin // 压缩打包代码 --- 没法识别es6语法
npm install --save terser-webpack-plugin // 压缩打包代码 --- 替换uglifyjs
npm install --save-dev @babel/plugin-syntax-dynamic-import // 分离代码所用到的
npm install -D mini-css-extract-plugin // css提取
// 安装vue
npm install vue
npm install -D vue-loader vue-template-compiler // 安装vue-loader和vue-template-compiler
npm install -D sass-loader node-sass //编译<style>标签
npm install -D less less-loader //编译<style>标签(选择须要的)
// es6预处理器
npm install es6-promise // 处理es6
npm install -D babel-core
npm install babel-loader@7.1.5 // 须要和babel-core版本匹配
npm install --save-dev babel-plugin-transform-runtime
npm install --save babel-runtime
复制代码
npm install babel-loader@7.1.5
复制代码
npm install babel-preset-env --save-dev //.babelrc设置了env选项,选装相应的插件
复制代码
至此,项目可使用 npm run build进行打包项目,npm start运行项目了。vue的路由配置还在学习中,等待更新下一篇学习二的文档。共勉es6