项目名称: vue-initcss
npm i -D webpack
webpack.config.js
基础配置html
进阶配置vue
module.exports = { enter: {}, module: {}, plugins: [], output: {} }
enter: { app: './app/js/main.js' }
module: { rules: [ { test: /\.html$/, use: [ { loader: 'html-loader' } ] }, { test: /\.vue$/, use: [ { loader: 'vue-loader' } ] }, { test: /\.scss$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader', options: { module: true } }, { loader: 'sass-loader' }, ] }, ] },
options: { module: true }
开启css module//在webpack.config.js顶部引入path const path = require('path');
output: { filename: '[name].min.js', path: path.resolve(_dirname, 'dist') } }
配置好了 咱们开始安装loadersnode
npm i -D html-loader vue-loader style-loader css-loader sass-loader
若是有loader安装不成功请再单个安装它,或者换用cnpmwebpack
到这一步咱们的基础配置已经作好,代码以下:git
module.exports = { enter: { app: './app/js/main.js' }, module: { rules: [ { test: /\.html$/, use: [ { loader: 'html-loader' } ] }, { test: /\.vue$/, use: [ { loader: 'vue-loader' } ] }, { test: /\.scss$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader', options: { module: true } }, { loader: 'sass-loader' }, ] }, ] }, plugins: [], output: { filename: '[name].min.js', path: path.resolve(_dirname, 'dist') } }
devServer: { contentBase: path.join(__dirname, 'dist'), compress: true, port: 9000 }
配置好了 咱们开始安装它github
npm i -D webpack-dev-server
home/index.vueweb
<template> <div id="home"> <h1>首页</h1> <p>123123<p> </div> </template> <script> export default {} </script> <style lang="scss" scoped> .home { color: red; font-size: 80px; p { color: blue } } </style>
router/index.jsvue-router
import Vue from "vue" import Router from "vue-router" import Home from "../home/index.vue" Vue.use(Router); export default new Router({ routes: [{ path: '/', name: 'home', component: Home }] })
App.vuenpm
<template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'app' }; </script> <style lang="scss" scoped> </style>
main.js
import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false; new Vue({ router, render: h => h(App) }).$mount("#app")
咱们还须要安装 vue 和vue router
npm i vue vue-router
还须要安装两个依赖
npm i -D html-webpack-plugin clean-webpack-plugin
webpack.config.js顶部加入以下代码
const HtmlWebpackPlugin = require('html-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // 注意这里的写法, 这样写 const CleanWebpackPlugin 会报错
官网文档解释:HtmlWebpackPlugin简化了HTML文件的建立,以便为你的webpack包提供服务。这对于在文件名中包含每次会随着编译而发生变化哈希的 webpack bundle 尤为有用。 你可让插件为你生成一个HTML文件,使用lodash模板提供你本身的模板,或使用你本身的loader。另外你能够在github查看这个项目的详细配置。
配置plugins
plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: './views/index.html' }) ],
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div id="app"></div> </body> </html>
package.json 加入 "start": "webpack-dev-server --open"
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "webpack-dev-server --open" },
跑完发现一大堆报错
npm i vue-loader-plugin -S
webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin') module.exports = { // ... plugins: [ new VueLoaderPlugin() ] }
npm install -D px2rem-loader
module: { rules: [ { test: /\.html$/, use: 'html-loader' }, { test: /\.vue$/, use: 'vue-loader' }, { test: /\.scss$/, use: [ 'vue-style-loader', 'css-loader', { loader: 'px2rem-loader', options: { remUnit: 75, remPrecision: 6 } }, 'sass-loader' ] }, ] },
这部分为何这么配置,参考了Vue官方文档 -> 单文件组建 -> 针对高级用户 -> VueLoader
原来的webpack3.x须要在vue-loader 下配置css 和 sass 并配置 px2rem。
// ... { test: /\.scss$/, use: [ 'vue-style-loader', + { + loader: 'css-loader', + options: { + modules: true, + localIdentName: '[local]_[hash:base64:8]' + } + }, { loader: 'px2rem-loader', options: { remUnit: 75, remPrecision: 6 } }, 'sass-loader' ] },
若是你不知道如何使用css module 请参阅Vue官方文档 -> 单文件组建 -> 针对高级用户 -> VueLoader -> css module
npm install -D mini-css-extract-plugin
{ test: /\.scss$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { modules: true } }, { loader: 'px2rem-loader', options: { remUnit: 75, remPrecision: 6 } }, 'sass-loader' ] },
plugins: [ // ... new MiniCssExtractPlugin({ filename: 'style.css' }) ]
咱们须要使用webpack的DefinePlugin建立一个在编译时能够配置的全局常量。在webpack.config.js头部引入webpack
const webpack = require('webpack');
接下来咱们把module.exports的值改成箭头函数,并传入一个参数env
module.exports = env => { if (!env) { env = {} } return { // 原来的配置 } }
咱们先来作一个示例,例如咱们在开发环境不须要css提取
module.exports = env => { if (!env) { env = {} } let plugins = [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: './views/index.html' }), new VueLoaderPlugin(), ]; if (env.production) { plugins.push( new webpack.DefinePlugin({ 'process.env': { NODE_ENV: 'production' } }), new MiniCssExtractPlugin({ filename: 'style.css' }) ) }
对应的咱们还有修改部分原来的代码
{ test: /\.scss$/, use: [ * env.production?MiniCssExtractPlugin.loader:'vue-style-loader', { loader: 'css-loader', options: { modules: true } }, { loader: 'px2rem-loader', options: { remUnit: 75, remPrecision: 6 } }, 'sass-loader' ] },
以及原来的plugins配置咱们直接将它的值变为咱们上面定义的plugins。
package.json中咱们须要添加命令
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "webpack-dev-server --open", "watch": "webpack --watch", "build" : "webpack --env.production" },
注意咱们给webpack 传递了参数,咱们就是利用这个参数来区分环境。
npm start
控制台咱们能够看到
css样式以style标签插入,并无被提取,说明MiniCssExtractPlugin插件没有运行
npm run build
运行打包后的index.html,css样式以link标签插入,说明css被提取合并为一个文件,说明生产环境下MiniCssExtractPlugin插件运行了
上面是的作法看起来更好理解,webpack4中咱们能够直接利用mode来区分开发环境和生产环境。头部咱们不须要引入webpack了, 由于咱们不须要依赖 DefinePlugin。
配置中新增:
mode: 'development' //默认是 development
module.exports = (env, argv) => { if (argv.mode === 'production') { //... } return config; };
npm i eslint -D
eslint支持多种格式的配置文件,同时支持把配置直接写在package.json中,咱们直接在写在package.json中,如何配置呢?
vue项目能够直接使用vue官方推荐的插件
npm i eslint-plugin-vue -D
package.json添加以下:
{ // 其余配置 "eslintConfig": { "root": true, "parserOptions": { "ecmaVersion": 2017 }, "extends": [ "mysticatea", "mysticatea/modules", "plugin:vue/recommended" ], "plugins": [ "node" ], "env": { "browser": false }, "globals": { "applicationCache": false, "atob": false, "btoa": false, "console": false, "document": false, "location": false, "window": false }, "rules": { "node/no-extraneous-import": "error", "node/no-missing-import": "error", "node/no-unpublished-import": "error", "vue/html-indent": [ "error", 4 ], "vue/max-attributes-per-line": "off" } }, "eslintIgnore": [ "node_modules", "webpack.config.js" ] }