管理非js依赖
webpack
对于非js资源的加载,通过配置项module
实现。
比如:
module.exports = {
// ...
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
};
复制代码
指定了当加载了一个.css
模块时,使用style-loader
或者css-loader
对其进行解析。
当然这些loader是需要进行安装才可以使用的,npm install --save-dev style-loader css-loader
。
vue单文件组件
在上一章我们提到了.vue
单文件组件的一个优点:将模板编译成render
函数,当然,优点不止这一个:单文件组件的优势。
所以我们准备使用单文件组件进行开发,那么问题来了,怎么加载.vue
模块?
前面提到了,对于非js资源我们需要使用配置module
来指定怎么加载,也就是指定某个loder。
对于.vue
文件,vue
官网有官方的加载器vue-loader
。
首先进行安装:
npm install --save-dev vue-loader
复制代码
安装完成后提示我们 vue-loader@14.1.1 requires a peer of vue-template-compiler@^2.0.0 but none was installed.
npm install --save-dev vue-template-compiler
复制代码
OK!
我们先不使用loader加载一下.vue
文件:
增加App.vue
组件
webpack-demo
|- package.json
|- webpack.config.js
|- index.html
|- /src
|- app.js
+ |- App.vue
复制代码
修改app.js
:
import Vue from 'vue';
import App from './App.vue';
Vue.config.devtools = true;
Vue.config.performance = true;
Vue.config.productionTip = false;
// const app = {
// template: '<h1>HELLO,PADAKER</h1>'
// render(h) {
// return h('h1', 'HELLO,PADAKER');
// }
// }
new Vue({
el: '#app',
render(h) {
return h('app');
},
// template: '<app />',
components: {
// app
App
}
});
复制代码
App.vue
:
<template>
<h1>HELLO,PADAKER</h1>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
</style>
复制代码
执行npm run build
:
ERROR in ./src/App.vue Module parse failed: Unexpected token (1:0) You may need an appropriate loader to handle this file type.
讲得很清楚了,你需要合适的加载器处理这类文件,接下来我们配置webpack:
module: {
rules: [
// ...
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
}
复制代码
再执行npm run build
,ok,没报错,打开index.html
,发现成功渲染,也没有报runtime-only build
的错。
vue-loader
配置项
将.vue
解析打包也不是一件简单的事情。首先.vue
文件需要处理template
,script
,style
三个部分,这三个部分如何处理、需不需要加载器、预处理?这些都可以通过配置来自定义。
- 首先我们来看看
template
:
vue-loader
将template
的内容直接处理为字符串,然后编译成render
函数,这也就是为什么需要先安装vue-template-compiler
的原因。preserveWhitespace
去除标签之间的空格(去除inline元素之间的间隙)
style
:
- 通过
loaders
选项,可以覆盖style
里的内容的默认加载器:
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
css: 'css-style'
}
}
}
]
}
复制代码
vue-loader
默认将样式解析出来后,通过style
标签的形式加载在html
上,这样做可以减少请求的次数,但是也增加了.html
文件的体积。有些情况下我们希望能将.vue
文件的style
解析出来的css
单独存放到一个.css
文件中,以便能够被浏览器单独缓存。所以需要以下设置:
const ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
// ...
module: {
rules: [
// ...
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
css: ExtractTextPlugin.extract({
use: 'css-loader',
fallback: 'vue-style-loader'
})
}
}
}
]
},
plugins: [
new ExtractTextPlugin('style.css')
]
};
复制代码
并在html
文件中引入:
<link rel="stylesheet" href="style.css">
复制代码
cssSourceMap
: 当开启该选项时,在devtool
里能准确的跟踪到样式所在文件的行数。默认开启,但是只有在webpack
的devtool
配置项不为false
时生效。
// webpack.config.js
module.exports = {
// ...
module: {
rules: [
// ...
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
// ...
cssSourceMap: true
}
}
]
},
devtool: '#source-map'
};
复制代码
script
:
- 使用
eslint
进行代码检验
首先安装eslint
、eslint-loader
;
npm install --save-dev eslint eslint-loader
复制代码
然后设置webpack
配置项。
// webpack.config.js
module.exports = {
// ...
module: {
rules: [
// only lint local *.vue files
+ {
+ enforce: 'pre',
+ test: /\.(js|vue)$/,
+ loader: 'eslint-loader',
+ exclude: /node_modules/
+ },
// but use vue-loader for all *.vue files
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
}
}
复制代码
为了检测.vue
文件,还需要使用到eslint-plugin-vue
,同样先安装:
npm install --save-dev eslint-plugin-vue
复制代码
在根目录新建.eslintrc.js
文件:
module.exports = {
"root": true,
- "parser": 'babel-eslint',
"parserOptions": {
+ "parser": 'babel-eslint',
"sourceType": 'module'
},
env: {
"browser": true,
},
extends: [
"standard",
+ "plugin:vue/essential"
]
};
复制代码
在继承的语法规则里面,我们使用的是standard
规则集,为了使用standard
共享设置,还需安装:
npm install --save-dev eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
复制代码
现在,当我们再去执行npm run build
构建打包时,webpack
会先调用eslint
检测语法错误。由于安装了eslint-plugin-vue
,同时也会检测.vue
文件中script
的语法错误以及vue开发的一些规则。
小结:
目前我们实现了加载.vue
组件,了解了如何对style
块配置相应的加载器进行加载,对解析出来的的css样式如何提取成为单文件,还有对项目的eslint
配置。