之前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脚手架(四)的更多相关文章

  1. 从0开始搭建vue+webpack脚手架(二)

    接着从0开始搭建vue+webpack脚手架(一) 三.配置webpack-dev-server 1. webpack-dev-server自带一个node的服务器, 项目在服务端运行的同时可以实现热 ...

  2. 从0开始搭建vue+webpack脚手架(三)

    在从0开始搭建vue+webpack脚手架(二)中已经基本完成了开发环境的配置.当开发完成后,我们需要将完成的项目进行打包,接下来对打包做一些优化: 运行 $ npm run build 可生成dis ...

  3. 从0开始搭建vue+webpack脚手架(一)

    基于多数情况下都是使用vue-cli初始化项目, 却始终未去了解其原理.从零开始搭建,可以让自己更深层次的理解框架. 首先从最基本的npm 开始, 至于安装npm 和 node就不用再赘述了,那是前端 ...

  4. windows环境下搭建vue+webpack的开发环境

    前段时间一直在断断续续的看vue的官方文档,后来就慢慢的学习搭建vue的开发环境,已经有将近两周了,每到最后一步的时候就会报错,搞的我好郁闷,搁置了好几天,今天又接着搞vue的开发环境,终于成功了.我 ...

  5. windows下搭建vue+webpack的开发环境

    1. 安装git其右键git bash here定位比cmd的命令行要准确,接下来的命令都是利用git bash here.2. 安装node.js一般利用vue创建项目是要搭配webpack项目构建 ...

  6. element-ui和npm、webpack、vue-cli搭建Vue项目

    一.element-ui的简单使用 1.安装 1. npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 2. CDN ...

  7. 从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(一)

    摘要:随着前端技术的飞速发展,越来越多的技术领域开始被前端工程师踏足.从NodeJs问世至今,各种前端工具脚手架.服务端框架层出不穷,“全栈工程师”对于前端开发者来说,再也不只是说说而已.在NodeJ ...

  8. vue.js2.0:如何搭建开发环境及构建项目

    1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...

  9. vue-cli脚手架搭建Vue.js项目

    前提条件: 一.node.js 下载 https://nodejs.org/zh-cn/download/ 二.webpack 安装 npm install webpack -g   PS:-g 就是 ...

随机推荐

  1. 【凸包板题】Gym - 101484E E. Double Fence

    http://codeforces.com/gym/101484/problem/E 题解 凸包板题 #define _CRT_SECURE_NO_WARNINGS #include<cmath ...

  2. MySQL的一些概念

    数据库与服务器.客户端的层次关系 关于数据库 程序中需要存储数据的方式: 1 变量(列表.元组.集合.字典.嵌套) 2 外存(文件)(*.ini) 3 表格.Excel(*.xls.*.xlsx.*. ...

  3. MySQL命令:约束

    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性 约束分类: 约束类型与关键字: 主键      PRIMARY KEY 默认值  DEFAULT 唯一      UN ...

  4. invariant theory 不变量理论

    https://baike.baidu.com/item/不变量理论/9224903?fr=aladdininvariant theory 一组几何元素由 k个参数组成的向量 P1表示.若 T为某一变 ...

  5. 一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0。

    小结: 1.一个DRAM的存储单元存储的是0还是1取决于电容是否有电荷,有电荷代表1,无电荷代表0. https://baike.baidu.com/item/随机存取存储器/4099402?fr=a ...

  6. 【转】escape()、encodeURI()、encodeURIComponent()区别详解

    escape().encodeURI().encodeURIComponent()区别详解 原文链接:http://www.cnblogs.com/tylerdonet/p/3483836.html ...

  7. ORACLE监听配置及测试实验(2)

    实验四 在tnsname.ora里添加默认监听代号 [oracle@oracle01 admin]$ vi tnsnames.ora 添加一行 PORT1528=(ADDRESS = (PROTOCO ...

  8. tomcat去掉项目名称

    进入tomcat的conf目录,查看server.xml,找到<Host></Host>,在里面添加<Context path="" docBase= ...

  9. java各版本简单对比

    1995.5 Oak ——>java1.0 提出 write once run anywhere 1996.1 jdk1.0  jvm Sun Classic VM 1997.2 JDK1.1 ...

  10. 31-ADC模拟/数字转换

    31-ADC模拟/数字转换 (1).ADC的IO分配