vue项目的webpack4.X配置
这两天摆弄webpack,躺过很多坑,直到今天看了一位博主的文章才得以解决。他对配置中的各个部分做说明。
下面的配置99.9%抄自博主: https://www.cnblogs.com/nianyifenzhizuo/p/10271001.html
安装package.json中的node-sass可能因为网络原因不能成功安装
报错信息有一大串,其中提及python和gyp,其实不用去安装他们。只要执行下面的命令:
- npm set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
- npm i node-sass -D
以下为一个vue项目的基本配置:
项目根目录:
- {
- "name": "shop",
- "version": "1.0.0",
- "description": "",
- "main": "index.js",
- "scripts": {
- "clean": "rimraf dist",
- "build": "cross-env NODE_ENV=production webpack --config ./build/webpack.prod.conf.js",
- "dev": "cross-env NODE_ENV=development webpack-dev-server --config ./build/webpack.dev.conf.js",
- "start": "npm run clean && npm run build"
- },
- "author": "asd",
- "license": "ISC",
- "devDependencies": {
- "@babel/core": "^7.2.2",
- "@babel/plugin-transform-runtime": "^7.2.0",
- "autoprefixer": "^9.4.6",
- "babel-loader": "^8.0.5",
- "babel-plugin-transform-remove-console": "^6.9.4",
- "clean-webpack-plugin": "^1.0.1",
- "cross-env": "^5.2.0",
- "css-loader": "^2.1.0",
- "file-loader": "^3.0.1",
- "html-webpack-plugin": "^3.2.0",
- "mini-css-extract-plugin": "^0.5.0",
- "node-sass": "^4.11.0",
- "optimize-css-assets-webpack-plugin": "^5.0.1",
- "postcss-loader": "^3.0.0",
- "purify-css": "^1.2.5",
- "purifycss-webpack": "^0.7.0",
- "rimraf": "^2.6.3",
- "sass-loader": "^7.1.0",
- "style-loader": "^0.23.1",
- "uglifyjs-webpack-plugin": "^2.1.1",
- "url-loader": "^1.1.2",
- "vue-loader": "^15.6.2",
- "vue-style-loader": "^4.1.2",
- "vue-template-compiler": "^2.5.22",
- "webpack": "^4.29.0",
- "webpack-cli": "^3.2.1",
- "webpack-dev-server": "^3.1.14",
- "webpack-merge": "^4.2.1"
- },
- "dependencies": {
- "@babel/preset-env": "^7.3.1",
- "@babel/runtime": "^7.3.1",
- "axios": "^0.18.0",
- "body-parser": "^1.18.3",
- "cookie-parser": "^1.4.4",
- "express": "^4.16.4",
- "glob-all": "^3.1.0",
- "mongoose": "^5.4.11",
- "vue": "^2.5.22",
- "vue-lazyload": "^1.2.6",
- "vue-router": "^3.0.2"
- }
- }
package.json
- module.exports = {
- loader: 'postcss-loader',
- plugins: [
- require('autoprefixer')
- ]
- }
postcss.config.js
- {
- "presets": [
- [
- "@babel/preset-env",
- {
- "modules": false
- }
- ]
- ],
- "plugins": [
- "@babel/plugin-transform-runtime", [
- "transform-remove-console",
- {
- "include": ["error", "warn"]
- }
- ]
- ]
- }
.babelrc
项目根目录=>build文件夹
- const webpack = require('webpack')
- const { resolve }= require('path')
- const VueLoaderPlugin = require('vue-loader/lib/plugin')
- const HtmlWebpackPlugin = require('html-webpack-plugin')
- const MiniCssExtractPlugin = require('mini-css-extract-plugin')
- const isDev = process.env.NODE_ENV === 'production'
- let pluginsConfig = [
- new VueLoaderPlugin(),
- new HtmlWebpackPlugin({
- title: 'my App',
- template: resolve(__dirname, '../src/index.html')
- }),
- new webpack.DefinePlugin({
- 'process.env': {
- 'NODE_ENV': JSON.stringify(process.env.NODE_ENV)
- }
- })
- ]
- if (!isDev) {
- pluginsConfig = pluginsConfig.concat(new MiniCssExtractPlugin({
- filename: "css/[name]_[contenthash].css"
- }))
- }
- module.exports = {
- mode: process.env.NODE_ENV || 'production',
- entry: resolve(__dirname, '../src/index.js'),
- output: {
- filename: 'bundle.js',
- path: resolve(__dirname, '../dist')
- },
- resolve: {
- //引入时可以省略后缀
- extensions: ['.js', '.vue', '.json'],
- alias: {
- 'vue$': 'vue/dist/vue.esm.js',
- //@就了代表了src文件夹所在路径
- '@': resolve('src'),
- }
- },
- module: {
- rules: [{
- test: /\.vue$/,
- loader: 'vue-loader'
- },
- {
- test: /\.scss$/,
- use: [
- isDev ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
- {
- loader: 'css-loader',
- options: {
- modules: true,
- localIdentName: '[local]_[hash:base64:8]'
- }
- },
- 'sass-loader'
- ]
- },
- {
- test: /\.(png|jpg|gif)$/,
- loader: 'url-loader?name=images/[name]-[contenthash:5].[ext]&limit=2000'
- },
- {
- test: /\.js$/,
- loader: 'babel-loader?cacheDirectory',
- exclude: '/node_modules/',
- include: resolve(__dirname, '../src')
- }
- ]
- },
- plugins: pluginsConfig,
- }
webpack.base.confg.js
- const webpack = require('webpack')
- const path = require('path')
- const WebPackBaseConfig = require('./webpack.base.conf.js')
- const CleanWebpackPlugin = require('clean-webpack-plugin')
- const WebPackMerge = require('webpack-merge')
- module.exports = WebPackMerge(WebPackBaseConfig, {
- devtool: 'inline-source-map',
- devServer: {
- contentBase: path.join(__dirname, 'dist'), //告诉服务器从哪个目录中提供内容
- compress: true, //启用 gzip 压缩
- port: 9000, //端口号
- host: '0.0.0.0', //默认是 localhost。如果希望服务器外部可访问,则设置为0.0.0.0
- hot: true //启用热替换模块 必须配置 webpack.HotModuleReplacementPlugin
- },
- plugins: [
- new CleanWebpackPlugin(['dist']), //清理文件夹
- new webpack.HotModuleReplacementPlugin(), //启用热替换模块
- new webpack.NamedModulesPlugin() //启用HMR时,插件将显示模块的相对路径
- ]
- })
webpack.dev.conf.js
- const webpack = require('webpack')
- const path = require('path')
- const WebPackMerge = require('webpack-merge')
- const WebPackBaseConfig = require('./webpack.base.conf.js')
- const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
- const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
- const glob = require('glob-all')
- const PurifyCSSPlugin = require('purifycss-webpack')
- module.exports = WebPackMerge(WebPackBaseConfig, {
- output: {
- filename: '[name].js',
- chunkFilename: '[name].[chunkhash:5].js',
- path: path.resolve(__dirname, 'dist')
- },
- optimization: {
- splitChunks: {
- cacheGroups: {
- commons: {
- test: /[\\/]node_modules[\\/]/,
- name: 'vendors',
- chunks: 'all'
- }
- }
- },
- runtimeChunk: true,
- minimizer: [
- new UglifyJsPlugin({
- cache: true,
- parallel: true
- }),
- new OptimizeCSSAssetsPlugin()
- ]
- },
- plugins: [
- new PurifyCSSPlugin({
- paths: glob.sync([
- path.join(__dirname, '../src/')
- ]),
- purifyOptions: {
- whitelist: ['*purify*']
- }
- }),
- ]
- })
webpack.prod.conf.js
项目根目录=>src文件夹
- import Vue from 'vue'
- import router from './router/index.js'
- new Vue({
- el: '#app',
- router
- })
index.js
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset='utf-8'>
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="renderer" content="webkit|ie-comp|ie-stand">
- <title></title>
- </head>
- <body>
- <div id="app" v-cloak>
- <router-view></router-view>
- </div>
- </body>
- </html>
index.html
- <template>
- <div id="app">
- <img src="./assets/logo.png">
- <router-view/>
- </div>
- </template>
- <script>
- export default {
- name: 'App'
- }
- </script>
- <style>
- #app {
- font-family: 'Avenir', Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- text-align: center;
- color: #2c3e50;
- margin-top: 60px;
- }
- </style>
App.vue
项目根目录=>src文件夹=>router文件夹
- import Vue from 'vue'
- import Router from 'vue-router'
- import HelloWorld from '@/components/HelloWorld'
- Vue.use(Router)
- export default new Router({
- routes: [
- {
- path: '/',
- name: 'HelloWorld',
- component: HelloWorld
- }
- ]
- })
index.js
项目根目录=>src文件夹=>components文件夹
- <template>
- <div class="hello">
- <h1>{{ msg }}</h1>
- <h2>Essential Links</h2>
- <ul>
- <li>
- <a
- href="https://vuejs.org"
- target="_blank"
- >
- Core Docs
- </a>
- </li>
- <li>
- <a
- href="https://forum.vuejs.org"
- target="_blank"
- >
- Forum
- </a>
- </li>
- <li>
- <a
- href="https://chat.vuejs.org"
- target="_blank"
- >
- Community Chat
- </a>
- </li>
- <li>
- <a
- href="https://twitter.com/vuejs"
- target="_blank"
- >
- </a>
- </li>
- <br>
- <li>
- <a
- href="http://vuejs-templates.github.io/webpack/"
- target="_blank"
- >
- Docs for This Template
- </a>
- </li>
- </ul>
- <h2>Ecosystem</h2>
- <ul>
- <li>
- <a
- href="http://router.vuejs.org/"
- target="_blank"
- >
- vue-router
- </a>
- </li>
- <li>
- <a
- href="http://vuex.vuejs.org/"
- target="_blank"
- >
- vuex
- </a>
- </li>
- <li>
- <a
- href="http://vue-loader.vuejs.org/"
- target="_blank"
- >
- vue-loader
- </a>
- </li>
- <li>
- <a
- href="https://github.com/vuejs/awesome-vue"
- target="_blank"
- >
- awesome-vue
- </a>
- </li>
- </ul>
- </div>
- </template>
- <script>
- export default {
- name: 'HelloWorld',
- data () {
- return {
- msg: 'Welcome to Your Vue.js App'
- }
- }
- }
- </script>
- <!-- Add "scoped" attribute to limit CSS to this component only -->
- <style scoped, lang="sass" src='@/assets/css/admin.scss'></style>
HelloWorld.vue
- h1, h2 {
- font-weight: normal;
- }
- ul {
- list-style-type: none;
- padding: 0;
- }
- li {
- display: inline-block;
- margin: 0 10px;
- }
- $link-color: #ff6000;
- a {
- color: $link_color;
- }
admin.scss
vue项目的webpack4.X配置的更多相关文章
- 基于Vue cli生成的Vue项目的webpack4升级
前面的话 本文将详细介绍从webpack3到webpack4的升级过程 概述 相比于webpack3,webpack4可以零配置运行,打包速度比之前提高了90%,可以直接到ES6的代码进行无用代码剔除 ...
- webstorm如何调试vue项目的js
webstorm如何调试vue项目的js webstormvuewebstorm调试jsjs 1.编辑调试配置,新建JavaScript调试配置,并设置要访问的url地址,如下图所示: 在URL处填写 ...
- vue项目的mode:history模式
最近做的Vue + Vue-Router + Webpack +minitUI项目碰到的问题,在此记录一下,Vue-router 中有hash模式和history模式,vue的路由默认是hash模式, ...
- maven(四):一个基本maven项目的pom.xml配置
继续之前创建的test项目,一个基本项目的pom.xml文件,通常至少有三个部分 第一部分,项目坐标,信息描述等 <modelVersion>4.0.0</modelVersion& ...
- vue 项目的I18n国际化之路
I18n (internationalization ) ---未完善 产品国际化是产品后期维护及推广中重要的一环,通过国际化操作使得产品能更好适应不同语言和地区的需求 国际化重点:1. 语言语言本地 ...
- Maven项目的pom.xml配置文件格式初识
Maven项目 有pom.xml文件的项目就已经是一个maven项目了,但是还没有被maven托管,我们需要将该项目添加为maven项目 <project xmlns="http:// ...
- java新项目的eclipse统一配置记录
1.new java file的模版 /** * @Title:${file_name} * @Copyright: Copyright (c) 2016 * @Description: * < ...
- 56.关于vue项目的seo问题
不可否定的是,vue现在火.但是在实际项目中,特别是像一下交互网站,我们不可避免会考虑到的是seo问题,这直接关系到我们网站的排名,很多人说用vue搭建的网站不能做优化,那我们真的要放弃vue,放弃前 ...
- Vue项目的npm环境搭建
Vue项目的环境搭建主要步骤如下: vue项目创建 安装NodeJS +到官网下载自己系统对应的版本,这里我们下载Windows系统的64位zip文件,下载完成后解压,可以看到里面有一个node.ex ...
随机推荐
- win10下CorelDRAW菜单栏字体变成白色了怎么办?
相信很多同学安装了win10系统之后,你的 CDR 菜单栏就变了,变得没有任何内容,以白色显示,win10系统与CorelDRAW早期的版本兼容方面存在问题,(CorelDRAW x7/X8无此问题出 ...
- 密信(MeSince),将取代传统电子邮件
电子邮件发展至今已经有几十年的历史,但仍然是最重要的现代互联网应用之一.在全球范围内,每小时发送的非垃圾邮件数量超过30亿封,从工作场景的使用到个人生活,电子邮件都扮演着不可或缺的角色.但是由于明文电 ...
- Use gdb attach pid and debug it
- HDU 3117 Fibonacci Numbers( 矩阵快速幂 + 数学推导 )
链接:传送门 题意:给一个 n ,输出 Fibonacci 数列第 n 项,如果第 n 项的位数 >= 8 位则按照 前4位 + ... + 后4位的格式输出 思路: n < 40时位数不 ...
- 代理上网环境配置docker私有库
最后更新时间:2018年12月27日 Docker使用代理上网去 pull 各类 images,需要做如下配置: 创建目录: /etc/systemd/system/docker.service.d ...
- javascript 中一些奇葩的日期换算
1.获取今天的0时0分0秒(常用于开始日期的获取) new Date(new Date().toLocaleDateString()); // Mon Nov 12 2018 00:00:00 GMT ...
- Python-基础-day4
深浅copy 1.先看赋值运算 h1 = [1,2,3,['aihuidi','hhhh']] h2 = h1 h1[0] = 111 print(h1) print(h2) #结果: # [111, ...
- pytorch 6 build_nn_quickly 快速搭建神经网络
import torch import torch.nn.functional as F # replace following class code with an easy sequential ...
- Windows桌面美化
[工具链接]链接: https://pan.baidu.com/s/12aUGsu91F8WfaW5HU5ps3g 提取码: dnan [样例] [美化步骤] 1.解压下载文件,安装两个软件: Sta ...
- js获得 json对象的个数(长度)
function getJsonObjLength(jsonObj) { var Length = 0; for (var item in jsonObj) { Length++; } return ...