mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
b50bad56be
## Context When upgrading to Next.js 6.1.1-canary.4 and using the `emit-file-loader` included in Next.js, the following error is thrown: ```bash error in ./src/graveyard/pages/_app.scss Module build failed (from ../node_modules/next/dist/build/webpack/loaders/emit-file-loader.js): TypeError: Cannot read property 'context' of undefined at Object.module.exports (~/project-root/node_modules/next/dist/build/webpack/load ers/emit-file-loader.js:27:68) @ ./src/pages/_app.js 35:0-53 156:17-26 157:13-22 @ multi ./pages/_app.js ``` `next.config.js` (shortened): ```js module.exports = { webpack: (config, { dev }) => { config.module.rules.push({ test: /\.scss$/, use: [ { loader: 'emit-file-loader', options: { name: 'dist/[path][name].[ext].js' } }, { loader: 'babel-loader', options: { babelrc: false, extends: path.resolve(__dirname, './src/.babelrc') } }, 'styled-jsx-css-loader', { loader: 'postcss-loader', options: { sourceMap: dev } }, { loader: 'sass-loader', options: { sourceMap: dev } } ] }); return config; } }; ``` ## Suggested Fix A quick Google search brought me to a [related issue in `webpack-loader`](https://github.com/webpack-contrib/worker-loader/issues/125). As pointed out in the [Webpack docs](https://webpack.js.org/api/loaders/#this-rootcontext): > Starting with webpack 4, the formerly `this.options.context` is provided as `this.rootContext`. This PR makes this change while maintaining backward compatibility. ## System information Next.js: 6.1.1-canary.4 Node: v9.3.0
38 lines
1.2 KiB
JavaScript
38 lines
1.2 KiB
JavaScript
import loaderUtils from 'loader-utils'
|
|
|
|
module.exports = function (content, sourceMap) {
|
|
this.cacheable()
|
|
const callback = this.async()
|
|
const resourcePath = this.resourcePath
|
|
|
|
const query = loaderUtils.getOptions(this)
|
|
|
|
// Allows you to do checks on the file name. For example it's used to check if there's both a .js and .jsx file.
|
|
if (query.validateFileName) {
|
|
try {
|
|
query.validateFileName(resourcePath)
|
|
} catch (err) {
|
|
callback(err)
|
|
return
|
|
}
|
|
}
|
|
|
|
const name = query.name || '[hash].[ext]'
|
|
const context = query.context || this.rootContext || this.options.context
|
|
const regExp = query.regExp
|
|
const opts = { context, content, regExp }
|
|
const interpolateName = query.interpolateName || ((name) => name)
|
|
const interpolatedName = interpolateName(loaderUtils.interpolateName(this, name, opts), {name, opts})
|
|
const emit = (code, map) => {
|
|
this.emitFile(interpolatedName, code, map)
|
|
callback(null, code, map)
|
|
}
|
|
|
|
if (query.transform) {
|
|
const transformed = query.transform({ content, sourceMap, interpolatedName })
|
|
return emit(transformed.content, transformed.sourceMap)
|
|
}
|
|
|
|
return emit(content, sourceMap)
|
|
}
|