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之前执行是正确的。
结尾