一次webapck4 配置文件无效的解决历程
前言
升级webpack4,一定要去看文档,特别是更新说明,不要自持用过原本webpack就自己开始折腾。折腾到后面,可能就默默流下眼泪了。
webpack4的变化
webpack-cli抽离
webpack-cli被单独拆了出来,使用的时候如果只是全局装了CLI,直接执行的时候是可以的。
webpack --config ./config/webpack.dev.js
如果是写在npm hook里面会发现有点问题:
//package.json
"scripts": {
"dev": "webpack --config ./config/webpack.dev.js"
}
//shall
npm run dev
此时就会给提示:
One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
- webpack-cli (https://github.com/webpack/webpack-cli)
The original webpack full-featured CLI.
- webpack-command (https://github.com/webpack-contrib/webpack-command)
A lightweight, opinionated webpack CLI.
We will use "npm" to install the CLI via "npm install -D".
Which one do you like to install (webpack-cli/webpack-command):
如果是我没有全局装,我肯定会意识到要选一个,这个坑关键是我全局装了。所以就在那折腾半天。
其实官方文档开头就说明了。
npm install webpack webpack-cli --save-dev
安装完成之后,继续执行发现有warning:
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
mode规则
配置规则:必须在production 和 development之间选择一种,以便webpack 使用相应模式的内置优化
- production支持所有类型的优化已生成最优bundles
- development允许注释、提示和eval devtooldevtool的差别可以参考这里
- production不支持watching、development针对快速增量重建进行了优化
- production支持 module concatenating(Scope Hoisting)即作用域提升,可以将模块打包在一个函数里,这样减少了函数声明,文件体积也会减小。详细参考看这里
- process.env.NODE_ENV被设置用来区分环境(仅仅在构建代码而非config里面)
- 有一个hidden none mode的模式可以禁用所有内容
用法:
配置文件中:
module.exports = {
entry: Entrys,
mode: 'development'
}
cli 参数传入
webpack --mode=development
两种方式都是可行的,不过我遇到过一个很坑的问题,困扰自己好几天,最后知道真相的自己眼泪掉下来后面再提这个问题。
零配置快速开始
因为一直被吐槽配置太累,加上parcel给的压力,webpack4也支持零配置打包了。
如果没有配置文件,会默认以./src/index.js作为entry开始打包。
如果配置了webpack.config.js或者指定了--config 的文件路径,则依据对应配置文件开始。
问题表现
在webpack.config.js中配置了entry、mode等相关属性,配置文件如下:
module.export = {
mode:'production',
entry:{
app:'./src/test.js',
index:'./src/test.js'
},
output: {
path: process.cwd() + '/dist',
filename: '[name].[hash].js',
chunkFilename: '[name].[chunkhash].js',
crossOriginLoading: 'anonymous'
},
cache: true,
devtool: 'cheap-source-map',
externals: {
jquery: 'jQuery'
},
module: {
rules: [
{
test: /\.(js|jsx)?$/,
include: [
path.resolve(__dirname, "../src")
],
exclude: [
'node_modules',
path.resolve(__dirname, "../node_modules")
],
use: [
{
loader: 'babel-loader',
options:{
presets:['es2015']
}
}
]
}
]
},
resolve: {
modules: [
'node_modules'
],
extensions: [".js", ".json", ".jsx", ".css"],
},
devServer: {
proxy: { // proxy URLs to backend development server
'/api': 'http://localhost:3000'
},
contentBase: path.resolve(__dirname, "../dist"),
hot: true,
open:true
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title:'test'
}),
new webpack.HotModuleReplacementPlugin()
]
}
package.json命令配置:
"scripts": {
"build": "webpack --config webpack.prod.js"
}
//执行打包
npm run build
发现始终会有上面选择mode类型的提示,这让人不能接受,另外提示没有./src/index.js文件,但是我的配置入口是别的文件,这样让人很莫名
ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/****'
本着跟着提示解决问题的原则,少文件那就建一个呗(后来发现这种思维有时候有用,有时候还真要慎重),问题表现虽然一致,实质可能有所不同。
新建之后是可以运行了但是我们的配置文件好像没起作用,
dist下的打包文件是默认的main.js
而非我们指定的app和index
为了确保进入配置文件,我打了几个log,竟然都有输出,说明进去了,这问题就诡异了。
console.log(path.resolve(__dirname, './src')) //输出正确路径
module.export = {
//*****//
}
版本统一
初步猜想是版本问题,确实也有issue上提到过某些版本存在问题,对照着官方demo锁定版本之后问题依然存在。
猜测:应该是配置文件存在错误
配置检查
将官方最基本的配置拉进来拷贝进来试了一下,依然存在问题没能解决。
猜测:本地的环境存在问题,npm,node等版本
查看之后发现版本都是满足的。
运行demo
将demo拉到本地并启动,demo正常打包,说明本地环境是ok的。那么问题就明显了,我的配置文件或者项目搭建有问题,对照着demo的配置项,配置项没有明显问题,这样的话将,配置信息放入到demo中去,修改之后发现起作用,我又重新审视了下我的配置文件,不仅仅局限于配置部分的时候,发现
//我的写法,这样webpack拿到的就是undefined了。
module.export
//别人的demo
module.exports
webpack的兼容处理
webpack会将 webpack --config 传入的文件与本身默认配置进行merge,保证本身打包不出错。为了证明我们的推论,将配置文件只剩下output属性,并加上src/index.js
module.exports = {
output: {
path: process.cwd() + '/dist1',
// 直接的入口模zzz块名
filename: '[name].js',
// 非入口模块,也就是不需要打包到一起的,但又可能会用到,
// 这不就是按需加载的么
chunkFilename: '[name].[chunkhash].js',
crossOriginLoading: 'anonymous'
}
}
执行之后会发现打包到/dist1下面。所以上面写错module.exports的时候,走的完全是默认配置。前面的log打在了module.exports之前执行是正确的。
结尾
当遇到不可思议的问题的时候,建议静下心看一看,不要盲目搜索,另外最可靠的参考就是官方文档和实例,注意对比版本和环境,如果都没问题,那么再去尝试网上的各种解决方法。
这里总结一下给自己一个记录,希望解决思路能帮助其他人。
一次webapck4 配置文件无效的解决历程的更多相关文章
- wordpress设置固定链接无效的解决办法
声明:本人用的是Ubuntu 10.04 LAMP服务 以下内容是针对在Apache服务器下Wordpress修改固定链接出错无效的解决办法: 如果改了固定链接以后出问题,请查看Wordpress根目 ...
- spring boot:方法中使用try...catch导致@Transactional事务无效的解决(spring boot 2.3.4)
一,方法中使用try...catch导致@Transactional事务无效的解决方法 1,问题的描述: 如果一个方法添加了@Transactional注解声明事务, 而方法内又使用了try catc ...
- 设置height:100%无效的解决方法
设置height:100%无效的解决方法 刚接触网页排版的新手,常出现这种情况:设置table和div的高height="100%"无效,使用CSS来设置height:" ...
- [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得
[讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得 prerouting 发表于 2010-5-9 16:50:46 https://www.itsk.com/thread-36634- ...
- WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法
文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...
- 移动端bug~~移动端:active伪类无效的解决方法【移动端 :active样式无效】
移动端:active伪类无效的解决方法[移动端 :active样式无效]2016-09-26 15:46:50 问题: 移动端开发的时候实现按钮的点击样式变化,但是在iphone[safiri Mo ...
- js中style.display=""无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- 解析php file_exists无效的解决办法
php中file_exists无效的解决办法. 方法1 :据官方手册上描述若php教程的safe mode相关的设置过于苛刻,就会出现这样的情形:尽管文件真实存在也被误报,认为文件不存在. 由于服务器 ...
- redhat linux enterprise 5 输入ifconfig无效的解决方法
redhat linux enterprise 5 输入ifconfig无效的解决方法 在安装完成linux后,进入终端,输入命令行ifconfig,会提示bash: ifconfig: comm ...
随机推荐
- 【C++】解决vs2015经常卡顿的办法
VS2015经常性的卡顿,参考了zhihu里问答的办法,编译和使用的时候的确快多了 为什么vs2015经常卡顿? https://www.zhihu.com/question/34911426 感谢z ...
- python内置模块之unittest测试(五)
系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) python模块分析之logging日志(四) pytho ...
- Hard Negative Mning
对于hard negative mining的解释,引用一波知乎: 链接:https://www.zhihu.com/question/46292829/answer/235112564来源:知乎 先 ...
- gamma校正
1 gamma校正背景 在电视和图形监视器中,显像管发生的电子束及其生成的图像亮度并不是随显像管的输入电压线性变化,电子流与输入电压相比是按照指数曲线变化的,输入电压的指数要大于电子束的指数.这说明暗 ...
- python令牌桶算法
import time class TokenBucket(object): # rate是令牌发放速度,capacity是桶的大小 def __init__(self, rate, capacity ...
- 【转】C语言正确使用extern关键字
利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下. 一.引用同一个文件中的变量 #include<stdio.h> int f ...
- 【转】OpenCV对图片中的RotatedRect进行填充
函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...
- Javascript构造函数的继承
仅供学习参考,原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 今天要介绍 ...
- PYTHON-网络通信 TCP
网络编程: 学习网络编程 为什么?目的: 服务端特点: 网络通讯(通信) 什么是网络通讯? 为什么?目的:网络建立的目的是为数据交互(通信) 如何实现通讯(通信)? 互联网协议 互联网=物理连接介质+ ...
- 请手动释放你的资源(Please release resources manually)
作者: Laruence( ) 本文地址: http://www.laruence.com/2012/07/25/2662.html 转载请注明出处 我从来不认为这个问题是个问题, 直到昨天. 昨 ...