Nuxt/lib/builder/webpack/base.config.js

171 lines
5.1 KiB
JavaScript
Raw Normal View History

2017-06-12 20:32:34 +00:00
import ExtractTextPlugin from 'extract-text-webpack-plugin'
2017-06-15 22:28:08 +00:00
import { defaults, cloneDeep } from 'lodash'
import { join, resolve } from 'path'
2017-06-15 22:19:53 +00:00
import webpack from 'webpack'
2017-06-16 12:42:45 +00:00
import { isUrl, urlJoin } from 'utils'
2017-06-18 09:35:00 +00:00
import autoprefixer from 'autoprefixer'
2017-06-12 20:32:34 +00:00
import vueLoaderConfig from './vue-loader.config'
import { styleLoader, extractStyles } from './helpers'
2016-11-07 01:34:58 +00:00
/*
|--------------------------------------------------------------------------
| Webpack Shared Config
|
2016-11-18 03:02:43 +00:00
| This is the config which is extended by the server and client
2016-11-07 01:34:58 +00:00
| webpack config files
|--------------------------------------------------------------------------
*/
2017-06-11 14:17:36 +00:00
export default function webpackBaseConfig ({ isClient, isServer }) {
2016-12-09 17:54:17 +00:00
const nodeModulesDir = join(__dirname, '..', 'node_modules')
2017-06-15 22:19:53 +00:00
2017-06-19 15:47:31 +00:00
/* istanbul ignore if */
if (!Array.isArray(this.options.build.postcss)) {
this.options.build.postcss = [
2017-06-18 09:35:00 +00:00
autoprefixer({
browsers: ['last 3 versions']
})
]
}
2017-06-15 22:19:53 +00:00
const config = {
2017-06-19 20:14:13 +00:00
devtool: this.options.dev ? 'cheap-module-source-map' : 'nosources-source-map',
entry: {
2017-01-11 21:18:47 +00:00
vendor: ['vue', 'vue-router', 'vue-meta']
},
output: {
2017-06-15 22:19:53 +00:00
path: resolve(this.options.buildDir, 'dist'),
filename: this.options.build.filenames.app,
chunkFilename: this.options.build.filenames.chunk,
2017-06-11 14:17:36 +00:00
publicPath: (isUrl(this.options.build.publicPath)
? this.options.build.publicPath
: urlJoin(this.options.router.base, this.options.build.publicPath))
},
2016-12-15 17:53:00 +00:00
performance: {
2017-06-19 23:04:01 +00:00
maxEntrypointSize: 1000000,
2017-03-24 15:12:59 +00:00
maxAssetSize: 300000,
2017-06-15 22:19:53 +00:00
hints: this.options.dev ? false : 'warning'
2016-12-15 17:53:00 +00:00
},
resolve: {
2017-05-20 09:36:35 +00:00
extensions: ['.js', '.json', '.vue', '.ts'],
2016-11-14 22:59:54 +00:00
alias: {
2017-06-11 14:17:36 +00:00
'~': join(this.options.srcDir),
2017-07-04 14:21:41 +00:00
'~~': join(this.options.rootDir),
'@': join(this.options.srcDir),
'@@': join(this.options.rootDir),
// Used by vue-loader so we can use in templates
// with <img src="~/assets/nuxt.png" />
'assets': join(this.options.srcDir, 'assets'),
'static': join(this.options.srcDir, 'static')
2016-11-14 22:59:54 +00:00
},
modules: [
this.options.modulesDir,
2017-05-20 09:36:35 +00:00
nodeModulesDir
]
},
resolveLoader: {
modules: [
this.options.modulesDir,
2017-05-20 09:36:35 +00:00
nodeModulesDir
]
},
module: {
2017-06-15 22:19:53 +00:00
noParse: /es6-promise\.js$/, // avoid webpack shimming process
rules: [
{
test: /\.vue$/,
2016-11-14 22:59:54 +00:00
loader: 'vue-loader',
2017-01-09 14:10:22 +00:00
query: vueLoaderConfig.call(this, { isClient, isServer })
},
{
test: /\.js$/,
2016-11-14 22:59:54 +00:00
loader: 'babel-loader',
exclude: /node_modules/,
2016-11-18 09:38:47 +00:00
query: defaults(this.options.build.babel, {
presets: [require.resolve('babel-preset-vue-app')],
2017-04-17 13:27:32 +00:00
babelrc: false,
2017-06-11 14:17:36 +00:00
cacheDirectory: !!this.options.dev
2016-11-18 09:38:47 +00:00
})
},
{ test: /\.css$/, use: styleLoader.call(this, 'css') },
{ test: /\.less$/, use: styleLoader.call(this, 'less', 'less-loader') },
2017-05-20 09:36:35 +00:00
{ test: /\.sass$/, use: styleLoader.call(this, 'sass', 'sass-loader?indentedSyntax&sourceMap') },
{ test: /\.scss$/, use: styleLoader.call(this, 'sass', 'sass-loader?sourceMap') },
2017-06-11 19:04:59 +00:00
{ test: /\.styl(us)?$/, use: styleLoader.call(this, 'stylus', 'stylus-loader') },
{
test: /\.(png|jpe?g|gif|svg)$/,
loader: 'url-loader',
query: {
limit: 1000, // 1KO
name: 'img/[name].[hash:7].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 1000, // 1 KO
name: 'fonts/[name].[hash:7].[ext]'
}
2017-07-31 08:41:40 +00:00
},
{
test: /\.(webm|mp4)$/,
2017-08-01 15:40:31 +00:00
loader: 'file',
query: {
name: 'videos/[name].[hash:7].[ext]'
}
2017-06-11 19:04:59 +00:00
}
]
},
plugins: this.options.build.plugins
2016-11-07 01:34:58 +00:00
}
2017-06-15 22:19:53 +00:00
// CSS extraction
if (extractStyles.call(this)) {
config.plugins.push(
2017-06-11 14:17:36 +00:00
new ExtractTextPlugin({ filename: this.options.build.filenames.css })
)
}
2017-06-15 22:19:53 +00:00
// Workaround for hiding Warnings about plugins without a default export (#1179)
config.plugins.push({
apply (compiler) {
compiler.plugin('done', stats => {
stats.compilation.warnings = stats.compilation.warnings.filter(warn => {
if (warn.name === 'ModuleDependencyWarning' && warn.message.includes(`export 'default'`) && warn.message.includes('plugin')) {
return false
}
return true
})
})
}
})
2017-06-15 22:19:53 +00:00
// --------------------------------------
// Dev specific config
// --------------------------------------
if (this.options.dev) {
//
}
// --------------------------------------
// Production specific config
// --------------------------------------
if (!this.options.dev) {
// This is needed in webpack 2 for minify CSS
config.plugins.push(
new webpack.LoaderOptionsPlugin({
minimize: true
})
)
2017-06-19 19:15:59 +00:00
// Scope Hoisting
// config.plugins.push(
// new webpack.optimize.ModuleConcatenationPlugin()
// )
2017-06-15 22:19:53 +00:00
}
// Clone deep avoid leaking config between Client and Server
return cloneDeep(config)
2016-11-07 01:34:58 +00:00
}