Skip to content

Commit

Permalink
ncc Webpack build redux (vercel#7628)
Browse files Browse the repository at this point in the history
* Reimplement ncc webpack build

This reverts commit 6feca31.

* Shared webpack build

* ncc workaround pending @zeit/nccvercel#437

* update ncc

* build tweaks, fixup autodll-import

* possible Node 8 fix

* second possible Node 8 fix

* and update taskfile
  • Loading branch information
guybedford authored and Timer committed Jun 21, 2019
1 parent ff04095 commit e85a517
Show file tree
Hide file tree
Showing 38 changed files with 239 additions and 87 deletions.
14 changes: 14 additions & 0 deletions packages/next/build/bundles/autodll-webpack-plugin.js
@@ -0,0 +1,14 @@
const path = require('path')

module.exports = distDir => {
const autodllCachePath = path.resolve(
path.join(distDir, 'cache', 'autodll-webpack-plugin')
)

const autoDllWebpackPluginPaths = require('autodll-webpack-plugin/lib/paths')
autoDllWebpackPluginPaths.cacheDir = autodllCachePath
autoDllWebpackPluginPaths.getManifestPath = hash => bundleName =>
path.resolve(autodllCachePath, hash, `${bundleName}.manifest.json`)

return require('autodll-webpack-plugin')
}
4 changes: 4 additions & 0 deletions packages/next/build/bundles/bundled-webpack.js
@@ -0,0 +1,4 @@
exports.webpack = require('webpack')
exports.webpackGraphHelpers = require('webpack/lib/GraphHelpers')
exports.webpackDynamicEntryPlugin = require('webpack/lib/DynamicEntryPlugin')
exports.webpackNodeOutputFileSystem = require('webpack/lib/node/NodeOutputFileSystem')
1 change: 1 addition & 0 deletions packages/next/build/bundles/webpack-DynamicEntryPlugin.js
@@ -0,0 +1 @@
module.exports = require('./webpack/').webpackDynamicEntryPlugin
1 change: 1 addition & 0 deletions packages/next/build/bundles/webpack-GraphHelpers.js
@@ -0,0 +1 @@
module.exports = require('./webpack/').webpackGraphHelpers
@@ -0,0 +1 @@
module.exports = require('./webpack/').webpackNodeOutputFileSystem
1 change: 1 addition & 0 deletions packages/next/build/bundles/webpack.js
@@ -0,0 +1 @@
module.exports = require('./webpack/').webpack
2 changes: 1 addition & 1 deletion packages/next/build/compiler.ts
@@ -1,4 +1,4 @@
import webpack, { Stats } from 'webpack'
import webpack, { Stats } from 'next/dist/compiled/webpack.js'

export type CompilerResult = {
errors: Error[]
Expand Down
7 changes: 4 additions & 3 deletions packages/next/build/webpack-config.ts
Expand Up @@ -9,7 +9,7 @@ import {
import resolve from 'next/dist/compiled/resolve/index.js'
import path from 'path'
import { promisify } from 'util'
import webpack from 'webpack'
import webpack from 'next/dist/compiled/webpack.js'

import {
DOT_NEXT_ALIAS,
Expand All @@ -22,7 +22,6 @@ import { AllModulesIdentifiedPlugin } from './webpack/plugins/all-modules-identi
import BuildManifestPlugin from './webpack/plugins/build-manifest-plugin'
import { ChunkGraphPlugin } from './webpack/plugins/chunk-graph-plugin'
import ChunkNamesPlugin from './webpack/plugins/chunk-names-plugin'
import { importAutoDllPlugin } from './webpack/plugins/dll-import'
import { HashedChunkIdsPlugin } from './webpack/plugins/hashed-chunk-ids-plugin'
import { DropClientPage } from './webpack/plugins/next-drop-client-page-plugin'
import NextJsSsrImportPlugin from './webpack/plugins/nextjs-ssr-import'
Expand Down Expand Up @@ -482,7 +481,9 @@ export default async function getBaseWebpackConfig(
]

if (!isServer) {
const AutoDllPlugin = importAutoDllPlugin({ distDir })
const AutoDllPlugin = require('next/dist/compiled/autodll-webpack-plugin')(
distDir
)
devPlugins.push(
new AutoDllPlugin({
filename: '[name]_[hash].js',
Expand Down
@@ -1,4 +1,4 @@
import { loader } from 'webpack'
import { loader } from 'next/dist/compiled/webpack.js'
import loaderUtils from 'loader-utils'

export type ClientPagesLoaderOptions = {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/loaders/next-data-loader.ts
@@ -1,4 +1,4 @@
import { loader } from 'webpack'
import { loader } from 'next/dist/compiled/webpack.js'
import hash from 'string-hash'
import { basename } from 'path'
const nextDataLoader: loader.Loader = function(source) {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/loaders/next-minify-loader.ts
@@ -1,5 +1,5 @@
import loaderUtils from 'loader-utils'
import { loader } from 'webpack'
import { loader } from 'next/dist/compiled/webpack.js'
import minify from '../plugins/terser-webpack-plugin/src/minify'

const nextMiniferLoader: loader.Loader = function(source) {
Expand Down
@@ -1,4 +1,4 @@
import { loader } from 'webpack'
import { loader } from 'next/dist/compiled/webpack.js'
import { join } from 'path'
import { parse } from 'querystring'
import { BUILD_MANIFEST, REACT_LOADABLE_MANIFEST } from 'next-server/constants'
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/loaders/noop-loader.ts
@@ -1,4 +1,4 @@
import { loader } from 'webpack'
import { loader } from 'next/dist/compiled/webpack.js'

const NoopLoader: loader.Loader = source => source
export default NoopLoader
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'
import { createHash } from 'crypto'
import path from 'path'

Expand Down
@@ -1,4 +1,4 @@
import { Compiler } from 'webpack'
import { Compiler } from 'next/dist/compiled/webpack.js'
import { RawSource } from 'webpack-sources'
import {
BUILD_MANIFEST,
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/plugins/chunk-graph-plugin.ts
Expand Up @@ -4,7 +4,7 @@ import { CLIENT_STATIC_FILES_RUNTIME_MAIN } from 'next-server/constants'
import { EOL } from 'os'
import path from 'path'
import { parse } from 'querystring'
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'

type StringDictionary = { [pageName: string]: string[] }
const manifest: {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/plugins/chunk-names-plugin.ts
@@ -1,4 +1,4 @@
import { Compiler } from 'webpack'
import { Compiler } from 'next/dist/compiled/webpack.js'
// This plugin mirrors webpack 3 `filename` and `chunkfilename` behavior
// This fixes https://github.com/webpack/webpack/issues/6598
// This plugin is based on https://github.com/researchgate/webpack/commit/2f28947fa0c63ccbb18f39c0098bd791a2c37090
Expand Down
23 changes: 0 additions & 23 deletions packages/next/build/webpack/plugins/dll-import.ts

This file was deleted.

@@ -1,9 +1,9 @@
import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'
import { NormalizedMessage } from 'fork-ts-checker-webpack-plugin/lib/NormalizedMessage'
import webpack from 'webpack'
import webpack from 'next/dist/compiled/webpack.js'

export function Apply(compiler: webpack.Compiler) {
const hooks = ForkTsCheckerWebpackPlugin.getCompilerHooks(compiler)
const hooks = ForkTsCheckerWebpackPlugin.getCompilerHooks(compiler as any)

let additionalFiles: string[] = []

Expand Down
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'
import { createHash } from 'crypto'

export class HashedChunkIdsPlugin implements Plugin {
Expand Down
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'
import { extname } from 'path'

// Prevents outputting client pages when they are not needed
Expand Down
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'
import { realpathSync } from 'fs'

function deleteCache(path: string) {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/build/webpack/plugins/nextjs-ssr-import.ts
@@ -1,5 +1,5 @@
import { join, resolve, relative, dirname } from 'path'
import { Compiler } from 'webpack'
import { Compiler } from 'next/dist/compiled/webpack.js'

// This plugin modifies the require-ensure code generated by Webpack
// to work with Next.js SSR
Expand Down
@@ -1,4 +1,4 @@
import webpack from 'webpack'
import webpack from 'next/dist/compiled/webpack.js'
import { RawSource } from 'webpack-sources'
import { join, relative, dirname } from 'path'
import { IS_BUNDLED_PAGE_REGEX } from 'next-server/constants'
Expand Down
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'
import { RawSource } from 'webpack-sources'
import {
PAGES_MANIFEST,
Expand Down
Expand Up @@ -22,7 +22,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWAR
// Modified to strip out unneeded results for Next's specific use case

import url from 'url'
import { Compiler, compilation } from 'webpack'
import { Compiler, compilation } from 'next/dist/compiled/webpack.js'

function buildManifest(
compiler: Compiler,
Expand Down
4 changes: 2 additions & 2 deletions packages/next/build/webpack/plugins/serverless-plugin.ts
@@ -1,5 +1,5 @@
import { Compiler } from 'webpack'
import { connectChunkAndModule } from 'webpack/lib/GraphHelpers'
import { Compiler } from 'next/dist/compiled/webpack.js'
import { connectChunkAndModule } from 'next/dist/compiled/webpack-GraphHelpers'

/**
* Makes sure there are no dynamic chunks when the target is serverless
Expand Down
@@ -1,4 +1,4 @@
import { Compiler, Plugin } from 'webpack'
import { Compiler, Plugin } from 'next/dist/compiled/webpack.js'

export class SharedRuntimePlugin implements Plugin {
apply(compiler: Compiler) {
Expand Down
Expand Up @@ -4,7 +4,7 @@
import stringHash from 'string-hash'
import { SourceMapConsumer } from 'source-map'
import { SourceMapSource, RawSource } from 'webpack-sources'
import { RequestShortener } from 'webpack'
import { RequestShortener } from 'next/dist/compiled/webpack.js'
import TaskRunner from './TaskRunner'

const warningRegex = /\[.+:([0-9]+),([0-9]+)\]/
Expand Down
Expand Up @@ -2,7 +2,7 @@ import { join } from 'path'
import { promisify } from 'util'
import fs from 'fs'
import { IS_BUNDLED_PAGE_REGEX } from 'next-server/constants'
import { Compiler } from 'webpack'
import { Compiler } from 'next/dist/compiled/webpack.js'

const unlink = promisify(fs.unlink)

Expand Down
13 changes: 7 additions & 6 deletions packages/next/package.json
Expand Up @@ -68,7 +68,6 @@
"@babel/runtime-corejs2": "7.4.5",
"amphtml-validator": "1.0.23",
"async-sema": "3.0.0",
"autodll-webpack-plugin": "0.4.2",
"babel-core": "7.0.0-bridge.0",
"babel-loader": "8.0.6",
"babel-plugin-react-require": "3.0.0",
Expand All @@ -82,6 +81,7 @@
"loader-utils": "1.2.3",
"mkdirp": "0.5.1",
"next-server": "8.1.1-canary.54",
"node-libs-browser": "2.2.0",
"prop-types": "15.7.2",
"prop-types-exact": "1.2.0",
"react-error-overlay": "5.1.6",
Expand All @@ -96,9 +96,6 @@
"unfetch": "4.1.0",
"url": "0.11.0",
"watchpack": "2.0.0-beta.4",
"webpack": "4.32.2",
"webpack-dev-middleware": "3.7.0",
"webpack-hot-middleware": "2.25.0",
"webpack-sources": "1.3.0",
"worker-farm": "1.7.0"
},
Expand Down Expand Up @@ -129,15 +126,19 @@
"@types/styled-jsx": "2.2.8",
"@types/text-table": "0.2.1",
"@types/webpack-sources": "0.1.5",
"@zeit/ncc": "0.18.5",
"@zeit/ncc": "0.20.1",
"arg": "4.1.0",
"autodll-webpack-plugin": "0.4.2",
"babel-plugin-dynamic-import-node": "2.2.0",
"nanoid": "2.0.3",
"resolve": "1.11.0",
"taskr": "1.1.0",
"text-table": "0.2.0",
"typescript": "3.5.1",
"unistore": "3.4.1"
"unistore": "3.4.1",
"webpack": "4.32.2",
"webpack-dev-middleware": "3.7.0",
"webpack-hot-middleware": "2.25.0"
},
"engines": {
"node": ">= 8.0.0"
Expand Down
6 changes: 3 additions & 3 deletions packages/next/server/hot-reloader.js
@@ -1,9 +1,9 @@
import { relative as relativePath, join, normalize, sep } from 'path'
import WebpackDevMiddleware from 'webpack-dev-middleware'
import WebpackHotMiddleware from 'webpack-hot-middleware'
import WebpackDevMiddleware from 'next/dist/compiled/webpack-dev-middleware'
import WebpackHotMiddleware from 'next/dist/compiled/webpack-hot-middleware'
import errorOverlayMiddleware from './lib/error-overlay-middleware'
import onDemandEntryHandler, { normalizePage } from './on-demand-entry-handler'
import webpack from 'webpack'
import webpack from 'next/dist/compiled/webpack.js'
import getBaseWebpackConfig from '../build/webpack-config'
import {
IS_BUNDLED_PAGE_REGEX,
Expand Down
2 changes: 1 addition & 1 deletion packages/next/server/on-demand-entry-handler.js
@@ -1,4 +1,4 @@
import DynamicEntryPlugin from 'webpack/lib/DynamicEntryPlugin'
import DynamicEntryPlugin from 'next/dist/compiled/webpack-DynamicEntryPlugin'
import { EventEmitter } from 'events'
import { join, posix } from 'path'
import { parse } from 'url'
Expand Down
12 changes: 4 additions & 8 deletions packages/next/taskfile-ncc.js
Expand Up @@ -7,8 +7,7 @@ const { basename, dirname, extname, join, relative } = require('path')
module.exports = function (task) {
task.plugin('ncc', {}, function * (file, options) {
return ncc(join(__dirname, file.dir, file.base), {
// cannot bundle
externals: ['chokidar'],
filename: file.base,
...options
}).then(({ code, assets }) => {
Object.keys(assets).forEach(key =>
Expand All @@ -20,7 +19,7 @@ module.exports = function (task) {
)

if (options && options.packageName) {
writePackageManifest.call(this, options.packageName)
writePackageManifest.call(this, options.packageName, file.base)
}

file.data = Buffer.from(code, 'utf8')
Expand All @@ -31,12 +30,9 @@ module.exports = function (task) {
// This function writes a minimal `package.json` file for a compiled package.
// It defines `name`, `main`, `author`, and `license`. It also defines `types`.
// n.b. types intended for development usage only.
function writePackageManifest (packageName) {
function writePackageManifest (packageName, main) {
const packagePath = require.resolve(packageName + '/package.json')
let { name, main, author, license, types, typings } = require(packagePath)
if (!main) {
main = 'index.js'
}
let { name, author, license, types, typings } = require(packagePath)

let typesFile = types || typings
if (typesFile) {
Expand Down

0 comments on commit e85a517

Please sign in to comment.