从0开始搭建vue+webpack脚手架(四)
之前1-3部分是webpack最基本的配置, 接下来会把项目结构和配置文件重新设计,可以扩充更多的功能模块。
一、重构webpack的配置项
1. 新建目录build,存放webpack不同的配置文件
(1) webpack.config.base.js 【保留公共的配置项,将生产环境和开发环境使用的配置项分离出去】
const path = require('path')
const webpack = require('webpack')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin') const isDev = process.env.NODE_ENV === 'development' const config = {
mode: process.env.NODE_ENV || 'production'
target: 'web',
performance: {
hints: false,
maxAssetSize: 500000
},
entry: path.join(__dirname, '../src/index.js'),
output: {
path: path.join(__dirname, '../dist'),
filename: 'scripts/bundle.[hash:8].js'
},
module: {
rules: [
{
test: /\.vue$/,
use: [
{
loader: "vue-loader"
}
]
},
{
test: /\.jsx$/,
loader: "babel-loader"
},
{
test: /\.js$/,
loader: "babel-loader",
exclude: /node_modules/
},
{
test: /\.(jpg|jpeg|gif|png|svg)$/,
use: [
{
loader: "url-loader",
options: {
limit: 1024,
name: 'images/[name]-[hash:8].[ext]'
}
}
]
}
]
},
plugins: [
new VueLoaderPlugin()
]
} module.exports = config
注意: 入口文件和输出路径
注意: VueLoaderPlugin是使用vue-loader必须的,两种环境都需要加载。jsx和js的规则分开配置,因为js编译时需要除去node_modules目录下的文件。
(2) webpack.config.client.js 【配置开发和生产环境环境需要的选项】
安装 webpack-merge工具, 提供配置文件扩展方法。
$ npm i -D webpack-merge
(3) 在webpack.config.client.js中使用merge对基础的配置baseConfig进行扩展。
const path = require('path')
const webpack = require('webpack')
const merge = require('webpack-merge')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const baseConfig = require('./webpack.config.base') const isDev = process.env.NODE_ENV === 'development'
const basePlugin = [
new VueLoaderPlugin(),
new CleanWebpackPlugin(['../dist']),
// 根据不同环境区分打包
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: isDev ? '"development"' : '"production"',
}
}),
new HtmlWebpackPlugin({
template: path.join(__dirname, '../index.html')
})
]
const devServer = {
port: 9000,
host: '0.0.0.0',
overlay: {
errors: true
},
historyApiFallback: true,
hot: true,
} let config if (isDev) {
config = merge(baseConfig, {
// mode: 'development',
// devtool: '#cheap-module-eval-source-map',
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.styl(us)?$/,
use: [
'style-loader',
'css-loader',
{
loader: "postcss-loader",
options: {
sourceMap: true
}
},
'stylus-loader',
]
},
]
},
devServer,
plugins: basePlugin.concat([
new webpack.HotModuleReplacementPlugin(),
new webpack.SourceMapDevToolPlugin() // devtool
])
})
} else {
config = merge(baseConfig, {
// mode: 'production',
entry: {
app: path.join(__dirname, '../src/index.js'),
vendor: ['vue']
},
output: {
filename: 'scripts/[name].[chunkhash:8].js'
},
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader']
})
},
{
test: /\.styl(us)?$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
{
loader: "postcss-loader",
options: {
sourceMap: true
}
},
'stylus-loader',
]
})
},
]
},
plugins: basePlugin.concat([
new ExtractTextPlugin('style.[hash:8].css'),
]),
optimization: {
splitChunks: {
chunks: 'all' // name: 'vendor'
},
runtimeChunk: true }
})
} module.exports = config
注意红色部分的修改:
1 .引入merge工具 和 webpack.config.base.js
2 .将公共plugin提取保存在变量 basePlugin, 不在base.js中使用的原因是后续的服务端渲染时无需使用, 故只在生产环境和开发环境引用。
3. 将devServer提取保存在变量中。
4. 声明变量config, 保存通过merge以baseConfig为基础扩展的配置项
5. basePlugin.concat()将公共的plugin添加到不同环境
修改package.json的运行脚本
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "cross-env NODE_ENV=production webpack --config build/webpack.config.client.js --colors --progress",
"dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js --colors --progress",
"start": "npm run dev"
},
注意, 指向指定路劲时必须使用 --config否则报错无法编译。之前不用--config是因为默认指向了根目录的webpack.config.js
至此: 运行 $ npm run build $ npm run dev正常。
另注: 如果后续需要编写服务端的代码,可以将项目分为client/ 和 server/ 两个目录,分别存放服务端和客户端的业务代码, 如下
将原来的src/改成client/ 注意别忘了修改 webpack.config.base.js和 webpack.config.client.js内的相关路径。目录修改根据自己的习惯和环境而定。
二、使用rimraf工具 ,在打包前删除旧包
1. 之前使用的是clean-webpack-plugin,rimraf也有同样的功能,但rimraf可以直接写在scripts脚本内
2. 安装 $ npm i -D rimraf
3 . 添加到 scripts中
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "npm run clean && cross-env NODE_ENV=production webpack --config build/webpack.config.client.js --colors --progress",
"dev": "npm run clean && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js --colors --progress",
"start": "npm run clean && npm run dev",
"clean": "rimraf dist"
},
三、添加eslint代码校验
(1)安装eslint及其依赖
npm i -D eslint
npm i -D eslint-config-standard eslint-plugin-standard
npm i -D eslint-plugin-promise eslint-plugin-import eslint-plugin-node
npm i -D eslint-plugin-html
特别要说明的是,在vue项目中,eslint默认是无法解析.vue的文件, 所以需要使用 eslint-plugin-html插件来解析 , 其他都是辅助eslint的插件和工具
(2)创建 .eslinrc配置文件
{
"extends": "standard",
"plugins": [
"html"
]
}
(3)package.json中添加命令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "npm run clean && cross-env NODE_ENV=production webpack --config build/webpack.config.client.js --colors --progress",
"dev": "npm run clean && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js --colors --progress",
"lint": "eslint --ext .js --ext .jsx --ext .vue client/",
"fix": "eslint --fix --ext .js --ext .jsx --ext .vue client/",
"start": "npm run clean && npm run dev",
"clean": "rimraf dist"
},
配置完成后运行脚本 : $ npm run lint会提示出一系列的警告。这是因为之前编写的代码中有些不符合eslint的默认规范。 可以使用 $ npm run fix命令批量修复。
(4)错误
在新版本的eslint中,如果设置extends为 'standard'则会报错:(不再支持"standard"的方式, 具体原因暂时未知),将eslinrc修改如下
module.exports = {
"env": {
"browser": true,
"commonjs": true,
"es6": true
},
"extends": ["eslint:recommended"],
"plugins": [
"html"
]
}
运行 $ npm run lint 但又出现错误:都不能使用export和 import, 继续添加配置
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2015,
"sourceType": "module"
},
此时运行 $ npm run lint不再报错。
以上是使用 eslint-plugin-html 解析vue文件 , 也可以使用插件 eslint-plugin-vue来解析vue 文件,安装插件后修改eslintrc
"extends": ["eslint:recommended", "plugin:vue/essential"],
"plugins": [
"vue"
],
运行 $ npm run lint检查错误, 运行 $ npm run fix修正错误。
(5)在webpack项目中使用eslint-loader
安装
$ npm i -D eslint-loader
$ npm i -D babel-eslint
eslintrc的 parserOptions 中添加 babel-eslint
"parserOptions": {
"parser": "babel-eslint", // 解析检测babel的代码
"ecmaFeatures": {
"jsx": true // 检测jsx语法
},
"ecmaVersion": 2015,
"sourceType": "module"
},
在 webpack.config.base.js中 rules 添加 eslint 规则
{
test: /\.(vue|js|jsx)$/,
exclude: /node_modules/,
loader: "eslint-loader",
enforce: "pre" // 预处理,在匹配的文件编译前先检测语法
},
至此, 运行项目, 并在业务文件内改成有错误的格式, eslint将会自动检测到后提示错误, 只要再修改回来即可正常。
接下来在 eslintrc文件中配置 rules,设置指定的语法格式。这里只配置了一小部分,根据项目需求可自定义。
"rules": {
"no-new": "off",
"no-alert": "off",
"no-console": [
"off"
],
"eol-last": 0,
"space-before-function-paren": 0,
"indent": 0
}
0 或者 off一般表示关闭不做解析。如以上代码中"indent" :0表示不做缩进的检测, "indent": 2 表示缩进是两个空格否则会报错, 其他用法可参考官网。
从0开始搭建vue+webpack脚手架(四)的更多相关文章
- 从0开始搭建vue+webpack脚手架(二)
接着从0开始搭建vue+webpack脚手架(一) 三.配置webpack-dev-server 1. webpack-dev-server自带一个node的服务器, 项目在服务端运行的同时可以实现热 ...
- 从0开始搭建vue+webpack脚手架(三)
在从0开始搭建vue+webpack脚手架(二)中已经基本完成了开发环境的配置.当开发完成后,我们需要将完成的项目进行打包,接下来对打包做一些优化: 运行 $ npm run build 可生成dis ...
- 从0开始搭建vue+webpack脚手架(一)
基于多数情况下都是使用vue-cli初始化项目, 却始终未去了解其原理.从零开始搭建,可以让自己更深层次的理解框架. 首先从最基本的npm 开始, 至于安装npm 和 node就不用再赘述了,那是前端 ...
- windows环境下搭建vue+webpack的开发环境
前段时间一直在断断续续的看vue的官方文档,后来就慢慢的学习搭建vue的开发环境,已经有将近两周了,每到最后一步的时候就会报错,搞的我好郁闷,搁置了好几天,今天又接着搞vue的开发环境,终于成功了.我 ...
- windows下搭建vue+webpack的开发环境
1. 安装git其右键git bash here定位比cmd的命令行要准确,接下来的命令都是利用git bash here.2. 安装node.js一般利用vue创建项目是要搭配webpack项目构建 ...
- element-ui和npm、webpack、vue-cli搭建Vue项目
一.element-ui的简单使用 1.安装 1. npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 2. CDN ...
- 从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(一)
摘要:随着前端技术的飞速发展,越来越多的技术领域开始被前端工程师踏足.从NodeJs问世至今,各种前端工具脚手架.服务端框架层出不穷,“全栈工程师”对于前端开发者来说,再也不只是说说而已.在NodeJ ...
- vue.js2.0:如何搭建开发环境及构建项目
1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...
- vue-cli脚手架搭建Vue.js项目
前提条件: 一.node.js 下载 https://nodejs.org/zh-cn/download/ 二.webpack 安装 npm install webpack -g PS:-g 就是 ...
随机推荐
- json序列化以及反序列化存在多个对象时候的处理
存在多个对象的时候,只需要将反序列化存在的对象,遍历出来即可. using System;using System.Collections.Generic;using System.Linq;usin ...
- Java 输入/输出——处理流(ObjectIO)
Object流:直接将Object流写入或读出. TestObjectIO.java transient关键字(英文名:透明的,可以用来修饰成员变量(实例变量),transient修饰的成员变量(实例 ...
- [daily][ulimit][coredump] 快速简单粗暴的用coredump调试
http://www.cnblogs.com/hugetong/p/6898608.html 一个程序挂掉了, 怎么办? 启动coredump 写一个脚本: [root@T185 ~]# cat / ...
- pip list 和 pip freeze
https://blog.csdn.net/vitaminc4/article/details/76576956 Pip’s documentation statespip descripti ...
- liteide 去除go程序cmd窗口
http://blog.csdn.net/aqtata/article/details/53389261
- 联系customer的js
import api from '@/js/api'; export var conService = function getInfoSend() { var loginState = localS ...
- 【雅思】【写作】【大作文】Advantage VS. Disadvantage
Advantage VS. Disadvantage Advantage vs. Disadvantage 社会现象或者做法 “People can work or study on the Inte ...
- int(1)和int(11)是否有区别?
MySQL类型关键字后面的括号内指定整数值的显示宽度(例如,INT(11)).该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过 ...
- windows(64位)下使用curl安装
windows(64位)下使用curl安装 转自:https://blog.csdn.net/wkj001/article/details/54889907 2017年02月06日 09:46:47 ...
- 前端 HTML form表单标签 input标签 type属性 radio 单选框
<input type="radio"> 单选框 适用于 选择性别按钮网页等 <!DOCTYPE html> <html lang="en& ...