什么是Webpack

WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

为什么要使用WebPack

1、模块化,让我们可以把复杂的程序细化为小的文件;

2、类似于TypeScript这种在JavaScript基础上拓展的开发语言:使我们能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能转换为JavaScript文件使浏览器可以识别;

3、Scss,less等CSS预处理器

4、...

这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为WebPack类的工具的出现提供了需求。

那么,本文就给出webpack基本的一些配置(如何安装webpack及其使用前的准备工作网上已经给的够多,这里不做描述)。

webpack.config.js配置如下:

const path = require('path')
const config = require('./config')
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const HtmlWebpackPlugin = require("html-webpack-plugin")
const CleanWebpackPlugin = require('clean-webpack-plugin')
// const OpenBrowserPlugin = require('open-browser-webpack4-plugin'); //没什么卵用
const webpack = require('webpack') function resolve (dir) {
return path.join(__dirname, '..', dir) //用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是/,Windows系统是\。
} module.exports = {
// devtool: 'config.dev.devtool', //每个module会通过eval()来执行,转化为字符串,并且生成一个DataUrl形式的SourceMap(#sourceMappingURL(base64)和#sourceURL)。
mode: 'development', //设置此项是为了在运行npm start时告知webpack当前是处于开发环境下就不会有警告提示。因为开发环境下,生成的文件有点过大所以会有警告提示
//入口文件的配置项 __dirname是nodejs里的一个全局变量,它指向的是我们项目的根目录
entry: __dirname + '/src/main.js', //配置入口文件的地址,可以是单一入口,也可以是多入口。
//出口文件的配置项
output:{
path: __dirname + '/dist',//打包后输出目录
// filename:'js/bundle-[chunkhash].js', //打包后输出的文件 热更新(HMR)不能和[chunkhash]同时使用。
filename: 'js/bundle-[hash].js'
}, //配置出口文件的地址,在webpack2.X版本后,支持多出口配置。
//模块:例如解读CSS,图片如何转换,压缩
module: { //配置模块,主要是解析CSS和图片转换压缩等功能。
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
exclude: /node_modules/,
include: resolve('src'),
options: {
compilerOptions: { //编译选项
preserveWhitespace: false //去掉元素之间的空格
}
}
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src')]
},
{
test: /\.html$/,
loader: 'html-loader'
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader'], //这种写法也是可以的 webpack的执行顺序是从右往左,即先执行postcss-loader再执行css-loader,最后执行style-loader。
// loader: 'style-loader!css-loader!postcss-loader' //这种写法也是可以的 /* 用以下这种写法来解决自动添加css前缀的问题也是可以的,
* 用了这种写法,上边的use: ['style-loader', 'css-loader', 'postcss-loader']或loader: 'style-loader!css-loader!postcss-loader'就可以注释掉了,
* 这种写法不需要在根目录再创建一个postcss.config.js配置文件,
* 但这种写法由于不需要在根目录再创建一个postcss.config.js配置文件,
* 所以会导致在编译less或sass等文件时会报“No PostCSS Config found in”的错误,
* 就是因为少了一个postcss.config.js配置文件
*/
// use: [
// 'style-loader',
// {
// loader: 'css-loader',
// options: {importLoaders: 1}
// },
// {
// loader: 'postcss-loader',
// options: {
// ident: 'postcss',
// plugins: [
// require('autoprefixer')({browsers: ['last 5 versions']}), //处理CSS前缀问题,自动添加前缀
// ]
// }
// }
// ],
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader'] //需要安装less
},
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader'] //需要安装node-sass,不需要安装sass
},
{
test: /\.(eot?.+|svg?.+|ttf?.+|otf?.+|woff?.+|woff2?.+)$/,
use: 'file-loader?name=assets/[name]-[hash:7].[ext]'
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/i,
loader: 'url-loader',
/* 设置了limit后,文件体积大于limit的,
* 将直接被放在dist目录下的assets文件中(此时文件没有被压缩),
* 并加上hash值显示在页面中,如果小于limit的,
* 则直接被打包成base64形式的文件。
*/
options:{
limit: 10000,
name: 'assets/[name]-[hash:7].[ext]'
}
},
]
},
resolve: {
extensions: ['.js', '.vue'],
modules: [
'./',
path.resolve(__dirname, 'node_modules'),
]
},
//插件,用于生产模版和各项功能
plugins:[ //配置插件,根据你的需要配置不同功能的插件。
//添加了hash之后,会导致改变文件内容后重新打包时,文件名不同而内容越来越多,因此就要用到这个很好用的插件clean-webpack-plugin。
//clean-webpack-plugin每次都会清理dist文件夹的内容。通常,在每次构建前清理/dist文件夹,是比较推荐的做法,因此只会生成用到的文件。
new CleanWebpackPlugin(['dist']), //打包时有用 当运行npm start处在开发环境时,dist文件就会被删掉。
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
//filename: "index-[hash].html",
//filename: "default.html", //filename可以改变生成的html文件的名称,最好跟template是一样的名称,不然生成一个新的html文件,就要挨个去修改超链接地址了,也可以不设置filename。
template: "index.html",
//inject: true, //设置插件放置的位置,不设置的话默认为true就放置在</body>之前,参数有"head"、"body"、true、false,其中参数"body"和true的效果是一样的。
minify:{ //压缩html
removeComments: true, //删除注释
collapseWhitespace: true //删除空格
}
}),
// new OpenBrowserPlugin({ url: 'http://localhost:3000' }), //自动在浏览器中运行,没什么卵用。webpack-dev-server自带的就有自动打开浏览器
new webpack.HotModuleReplacementPlugin()
],
//配置webpack开发服务功能
devServer:{
// hot: true, //这里如果设置为true就不会热重载了
// inline: true, //设置为true,当文件改变时会自动刷新页面。如果这里配置了inline为true,则上边的hot就不需要设置了(hot设置为true反而不会热重载),同时package.json中也不需要--inline了,且package.json不支持注释
open: config.dev.autoOpenBrowser, //用来自动打开浏览器
// publicPath: "config.dev.assetsPublicPath",
// proxy: config.dev.proxyTable, //设置反向代理
host: config.dev.host, //设置服务器的主机号
port: config.dev.port, //port配置属性指定了开启服务的端口号,如果省略,默认为"8080"
// overlay: true, //这个配置属性用来在编译出错的时候,在浏览器页面上显示错误,默认是false,可设置为true
// errorOverlay: true, //浏览器错误提示遮罩层
// notifyOnErrors: true, // 编译错误的时候通知提示,需要插件friendly-errors-webpack-plugin的配合
// quiet: true, //当它被设置为true的时候,控制台只输出第一次编译的信息,当你保存后再次编译的时候不会输出任何内容,包括错误和警告
// compress: true, //当它被设置为true的时候对所有的服务器资源采用gzip压缩
// historyApiFallback: true //在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html
}
}; //执行webpack命令会输出真实的文件,比如dist文件夹下的bundle-52b79b0580107adc0418.js,而执行webpack-dev-server命令输出的文件只存在于内存中,不输出真实的文件!

postcss.config.js配置如下:

module.exports = {
plugins: [
require('autoprefixer')({browsers: ['last 5 versions']})
]
}

webpack-dev-server依赖的基本配置config/index.js如下:

module.exports = {
dev: {
assetsPublicPath: '/', // 相对文件路径
proxyTable: {},
host: 'localhost',
port: '3000',
autoOpenBrowser: true, // 是否自动打开浏览器
devtool: 'eval-source-map', // Source Maps
}
}

项目依赖的插件package.json基本配置如下:

{
"name": "webpackproject",
"version": "1.0.0",
"description": "webpacksimpleproject",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack-dev-server --inline",
"dev": "webpack --mode development",
"build": "webpack --mode production"
},
"dependencies": {
"webpack": "^4.2.0"
},
"devDependencies": {
"autoprefixer": "^8.2.0",
"babel-core": "^6.26.0",
"babel-loader": "^8.0.0-beta.2",
"babel-preset-env": "^2.0.0-beta.2",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"file-loader": "^1.1.11",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.1.0",
"image-webpack-loader": "^4.2.0",
"imagemin-webpack-plugin": "^2.1.0",
"less": "^3.0.1",
"less-loader": "^4.1.0",
"node-sass": "^4.8.3",
"postcss-loader": "^2.1.3",
"sass": "^1.0.0-rc.1",
"sass-loader": "^6.0.7",
"style-loader": "^0.20.3",
"url-loader": "^1.0.1",
"webpack-cli": "^3.3.2",
"vue-loader": "^15.2.4",
"webpack-dev-server": "^3.1.4",
"clean-webpack-plugin": "^0.1.19",
"open-browser-webpack4-plugin": "1.0.0"
},
"author": "tnnyang",
"license": "ISC"
}

以上就是webpack的基本配置,里边的注释详细介绍了各配置的功能。当运行npm start后,DEMO项目会自动在浏览器中打开并可实现热重载。

以下写于2019年4月3日:

可能使用vue-loader v15版本后会提示报错,是因为15.*之后的版本在使用vue-loader时都需要伴随VueLoaderPlugin的。所以要么降低vue-loader的版本,要么如下设置:

// 加入到 plugins 里面就可以了
const VueLoaderPlugin = require('vue-loader/lib/plugin');
plugins: [
new VueLoaderPlugin()
]

一个webpack基本配置小项目DEMO

webpack之带有可自动打开浏览器及热重载的基本配置的更多相关文章

  1. vue中npm run dev 不能自动打开浏览器运行项目

    最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...

  2. webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载

    作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...

  3. vue无法自动打开浏览器

    原文链接: 点我 如果不能自动打开浏览器,是因为没有安装插件. 插件安装的方法1.安装插件,在cmd中输入: $ npm i open-browser-webpack-plugin --save这里的 ...

  4. vue-cli2.9.1如何自动打开浏览器及实现手机调试

    在vue-cli2.9.1以前我们运行 "npm run dev" 程序会自动打开浏览器进行调试,而且在手机浏览器输入 "IP地址:8080" 能实现在手机端的 ...

  5. vue中npm run dev运行项目自动打开浏览器

    npm run dev运行项目自动打开浏览器设置自动打开浏览器 // 各种设备设置信息      host: 'localhost', //主机名      port: 8080, // 端口号(默认 ...

  6. vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!

    vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...

  7. autoOpenBrowser: true, 运行npm后自动打开浏览器

    autoOpenBrowser: true, 运行npm后自动打开浏览器

  8. Jupyter Notebook不能自动打开浏览器

    安装了 Winpython,运行Jupyter Notebook.exe或Jupyter lab.exe,总是不能自动打开浏览器,提示"no web browser found" ...

  9. vue 使用 npm run dev命令后 自动打开浏览器

    1.使用vue-cli 老版本构建项目时, 可修改config文件夹下index.js文件 autoOpenBrowser 属性给为 true 即可 使用vue-cli 3.x 版本后,所有的配置项均 ...

随机推荐

  1. Redis(REmote DIctionary Server)基础

    Redis(REmote DIctionary Server)基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Redis是一个开放源代码(BSD许可)的内存数据结构存储,用作数 ...

  2. go 的包

  3. InnoDB-MVCC与乐观锁

    最近通过<高性能MySQL>一书学习MySQL方面的知识,在看到书中所讲InnoDB-MVCC部分的时候,有一种强烈的感觉,这不就是乐观锁吗(入门级小学徒的疑惑脸)?当下便去网上以各种方式 ...

  4. MongoDB3.6 一键化自动部署方案

    1.系统基础配置 下面的命令默认都使用root用户进行操作,操作系统为Centos7,mongodb3.6.x以上版本 1.1 修改系统配置文件/etc/security/limits.conf和/e ...

  5. [Android] Android 类似今日头条顶部的TabLayout 滑动标签栏 效果

    APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 本文主要讲的是用:T ...

  6. [物理学与PDEs]第1章习题4 偶极子的极限电势

    对在 $P_0$ 及 $P_1$ 处分别置放 $-q$ 及 $+q$ 的点电荷所形成的电偶极子, 其偶极距 ${\bf m}=q{\bf l}$, ${\bf l}=\vec{P_0P_1}$. 试证 ...

  7. ntp 服务:Server dropped: Strata too high

    1.通过ntpdate -d 服务端IP,显示Server dropped: Strata too high vi /etc/ntp.conf 在ntpd服务端的配置中添加 server 127.12 ...

  8. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  9. Codeforces Round #501 (Div. 3) D. Walking Between Houses

    题目链接 题意:给你三个数n,k,sn,k,sn,k,s,让你构造一个长度为k的数列,使得相邻两项差值的绝对值之和为sss, ∑i=1n∣a[i]−a[i−1]∣,a[0]=1\sum_{i=1}^n ...

  10. 【原创】大数据基础之Ambari(1)简介、编译安装、使用

    官方:http://ambari.apache.org/ The Apache Ambari project is aimed at making Hadoop management simpler ...