首先,我是想將 webpack 一個(gè)配置文件分成多個(gè)配置文件(基本配置 webpack.config.js、生產(chǎn)環(huán)境配置 webpack.prod.config.js 及開(kāi)發(fā)環(huán)境配置 webpack.dev.config.js),但是我所遇到的問(wèn)題是在分離出來(lái)的生產(chǎn)環(huán)境配置中,啟動(dòng)打包時(shí),無(wú)法正確解析 loader,報(bào)錯(cuò)信息如下:
ERROR in ./src/index.js
Module not found: Error: Can't resolve './App' in 'D:\git\visual-todos\src'
@ ./src/index.js 2:0-23 8:16-19 9:17-20
ERROR in ./src/router/index.js
Module not found: Error: Can't resolve '@/components/Layout' in 'D:\git\visual-todos\src\router'
@ ./src/router/index.js 3:0-40 12:17-23
@ ./src/index.js
在將生產(chǎn)環(huán)境配置放回基本配置中,即基本配置和生產(chǎn)環(huán)境配置在同一文件夾時(shí)就能正常解析并打包。
若在報(bào)錯(cuò)的代碼行,手動(dòng)添加后綴名 .vue,仍報(bào)錯(cuò):
ERROR in ./src/router/index.js
Module not found: Error: Can't resolve '@/components/Layout.vue' in 'D:\git\visual-todos\src\router'
@ ./src/router/index.js 3:0-44 12:17-23
@ ./src/index.js
visual-todos
├──build
| ├── webpack.config.js
| ├── webpack.dev.config.js
| └── webpack.prod.config.js
const webpack = require('webpack')
const path = require('path')
const baseWebpackConfig = require('./webpack.config')
const merge = require('webpack-merge')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const ExtractPlugin = require('extract-text-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const webpackConfig = merge(baseWebpackConfig, {
entry: {
app: resolve('src/index.js'),
vendor: ['vue', 'vue-loader']
},
output: {
filename: '[name].[chunkHash:8].js'
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true
}
},
'sass-loader'
]
})
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
new UglifyJsPlugin(),
new ExtractPlugin('styles.[contentHash:8].css')
],
optimization: {
runtimeChunk: {
name: 'runtime'
},
splitChunks: {
cacheGroups: {
commons: {
chunks: 'initial',
minSize: 0,
minChunks: 1
},
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendor',
chunks: 'all'
}
}
}
}
})
const path = require('path')
const HTMLPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
const isDev = process.env.NODE_ENV === 'development'
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const config = {
target: 'web',
context: path.resolve(__dirname, '../'),
entry: resolve('src/index.js'),
output: {
filename: 'bundle.[hash:8].js',
path: resolve('dist')
},
resolve: {
extensions: ['.js', '.vue', '.jsx', '.json'],
alias: {
'vue$': 'vue/dist/vue.runtime.esm.js',
'@': resolve('src'),
}
},
module: {
rules: [
{
test: /\.vue$/,
include: [resolve('src')],
loader: 'vue-loader'
},
{
test: /\.jsx$/,
include: [resolve('src')],
loader: 'babel-loader'
},
{
test: /\.( gif|jpg|jpeg|png|svg )$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
name: '[name].[ext]'
}
}
]
},
{
test: /\.(png|woff|woff2|eot|ttf|svg)$/,
loader: 'url-loader',
options: {
limit: 10000,
name: '[name].[hash:8].[ext]'
}
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: isDev ? '"development"' : '"production"'
}
}),
new HTMLPlugin({
filename: 'index.html',
template: 'index.html',
})
],
node: {
fs: 'empty'
}
}
if (isDev) {
config.module.rules.push({
test: /\.scss$/,
include: [resolve('src')],
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true,
config: {
path: './postcss.config.js'
}
}
},
'sass-loader'
]
})
config.devtool = '#cheap-module-eval-source-map'
config.devServer = {
port: '8080',
host: '0.0.0.0',
overlay: {
error: true,
},
hot: true
}
config.plugins.push(
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
)
}
module.exports = config
"build": "cross-env NODE_ENV=production webpack --progress --config build/webpack.prod.config.js --mode production",
"start": "cross-env NODE_ENV=development webpack-dev-server --progress --config build/webpack.config.js --mode development"
在基本配置中,我的思路是用 if 語(yǔ)句判斷當(dāng)前環(huán)境變量載入不同的配置。在沒(méi)有分離出來(lái)前,生產(chǎn)環(huán)境配置是在 if 語(yǔ)句判斷為 false 的代碼塊中。
因?yàn)榉呕鼗九渲媚軌蛘]d入模塊并打包,而且生產(chǎn)環(huán)境配置和基本配置在同一目錄下,就應(yīng)該不是路徑問(wèn)題。
因?yàn)槲沂莿倓倢W(xué)習(xí) webpack 的配置,不知道是我哪里配置錯(cuò)了,在分離出來(lái)的生產(chǎn)環(huán)境配置無(wú)法載入模塊。請(qǐng)大佬幫幫忙!謝謝!
參考了分離配置的標(biāo)準(zhǔn)是webpack 文檔和webpack doc
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。