1.10.1 • Published 2 years ago

@dawnjs/dn-middleware-webpack v1.10.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

@dawnjs/dn-middleware-webpack

npm npm

Getting Started

To begin, you'll need to install @dawnjs/dn-middleware-webpack:

$ npm i -D @dawnjs/dn-middleware-webpack

Then add the middleware to your dawn pipeline configuration. For example:

.dawn/pipe.yml

dev:
  - name: '@dawnjs/dn-middleware-webpack'

And run dn dev via your preferred method.

Important Warning

To be sure no other webpack middleware installed in your project. If any, please install the latest webpack@5 with npm install --dev webpack@5 manually in your project to ensure node_modules/webpack's version is 5.x.

Options

NameTypeDefaultDescription
configFilestring"./webpack.config.js"The path of custom configration for modify any webpack options
chainablebooleanfalseUse webpack-chain's Config instance for custorm config file
envstringDepends on environment variablesSet bundle environment, accepted values are "development" or "production"
cwdstringDepends on current working directorySpecify working directory manually, useful for monorepo project etc.
entrystring \| string[] \| objectDepends on files exist in srcSpecify app entry, support glob pattern and multi-entry
injectstring \| string[][]File list to be prepended to all entries
appendstring \| string[][]File list to be appended to all entries
outputstring \| object{ path: "./build" }Webpack output options
foldersobject{ script: "js", style: "css", media: "assets", html: "" }Output folders for different asset type
disableDynamicPublicPathbooleanfalseWether disable the auto dynamic public path feature or not
templateboolean \| string \| string[] \| objecttrueSpecify html template
targetstring \| string[] \| falseSpecify webpack target
externalbooleanDepends on envWhether enable externals or not
externalsobjectDepends on env and output.librarySpecify webpack externals
aliasobjectSet webpack's resolve.alias
tsconfigPathsPluginobjectOptions for tsconfig-paths-webpack-plugin
devtoolboolean \| stringDepends on envSet webpack's devtool option
commonobject{ disabled: false, name: 'common' }Simply set whether using common chunk or not and the common chunks's name
compressbooleanDepends on envEnable webpack's optimization.minimize option
esbuildobjectOptions for ESBuild's loader and plugin
swcboolean \| objectOptions for swc's loader and plugin
terserobject{ extractComments: false, terserOptions: { compress: { drop_console: true }, format: { comments: false } } }Options for terser-webpack-plugin
cssMinimizerobject{ minimizerOptions: { preset: ["default", { discardComments: { removeAll: true } }] } }Options for css-minimizer-webpack-plugin
optimizationobjectExtra optimization options
ignoreMomentLocalebooleantrueWhether to ignore locales in moment package or not
babelobjectOptions to custom behavior of babel preset
disabledTypeCheckbooleanfalseDisable type check for typescript files
typeCheckIncludestring[]["**/*"]Glob patterns for files to check types
injectCSSbooleanDepends on envShould inject css into the DOM, otherwise extract css to seperate files
styleLoaderobjectOptions for style-loader or MiniCssExtractPlugin.loader
cssLoaderobjectOptions for css-loader
postcssLoaderobject{ postcssOptions: { plugins: ["postcss-preset-env"] } }Options for postcss-loader
extraPostCSSPluginsany[]Extra plugins for PostCSS in postcss-loader
postcssPresetEnvobjectOptions for postcss-preset-env
lessLoaderobject{ lessOptions: { rewriteUrls: "all" } }Options for less-loader
resolveUrlLoaderobjectOptions for resolve-url-loader
sassLoaderobject{ sourceMap: true, sassOptions: { quietDeps: true } }Options for sass-loader
workerLoaderobject{ inline: "fallback" }Options for worker-loader
configobject{ name: "$config", path: "./src/config", env: ctx.command }Options to configure the runtime config virtual module
profilebooleanEnable webpack profile option and add webpack-stats-plugin to output stats file
statsOptsstring \| object"verbose"Options for stats in webpack-stats-plugin
analysisboolean \| objectEnable and set options for webpack-bundle-analyzer
watchbooleanEnable watch mode
watchOptsobject{ ignored: /node_modules/ }Options for watch mode
serverbooleanDepends on envEnable server mode
serverOptsobject{ host: "localhost", historyApiFallback: true, open: true, hot: true }Options for webpack-dev-server
lintboolean \| object{ extensions: "js,jsx,ts,tsx", formatter: require.resolve("eslint-formatter-pretty"), failOnError: false }Enable ESLint in server mode

configFile

Type: string Default: "./webpack.config.js"

By default, the custom configration file must export a valid function. In compatible mode, the custom configration file could export a valid function or a valid webpack config object.

Important: It is not recommend to modify existing module rules because their structure might be changed in the future.

Examples:

module.exports = function (config, webpack, ctx) {
  // config: a webpack config object or an instance of webpack-chain's `Config` in chainable mode
  // webpack: the imported `webpack` function
  // ctx: the dawn context
};

chainable

Type: boolean Default: false

By default, the first argument of custom configration function is a webpack config object. If enable chainable mode, the first argument would be a webpack-chain's Config instance.

Avaliable chainable config name:

  • rule (Access with config.module.rule(ruleName))
    • "assets"
      • oneOf (Access with config.module.rule("assets").oneOf(oneOfName))
        • "raw"
        • "inline"
        • "images"
        • "svg"
        • "fonts"
        • "plaintext"
        • "yaml"
    • "esbuild" (If using esbuild.loader)
      • oneOf (Access with config.module.rule("esbuild").oneOf(oneOfName))
        • "js"
          • use (Access with config.module.rule("esbuild").oneOf("js").use(useName))
            • "esbuild-loader"
        • "ts"
          • use (Access with config.module.rule("esbuild").oneOf("ts").use(useName))
            • "esbuild-loader"
        • "tsx"
          • use (Access with config.module.rule("esbuild").oneOf("tsx").use(useName))
            • "esbuild-loader"
    • "swc" (If using swc)
      • oneOf (Access with config.module.rule("swc").oneOf(oneOfName))
        • "js"
          • use (Access with config.module.rule("swc").oneOf("js").use(useName))
            • "swc-loader"
        • "ts"
          • use (Access with config.module.rule("swc").oneOf("ts").use(useName))
            • "swc-loader"
        • "tsx"
          • use (Access with config.module.rule("swc").oneOf("tsx").use(useName))
            • "swc-loader"
    • babel (If using babel, it's default)
      • oneOf (Access with config.module.rule("babel").oneOf(oneOfName))
        • "jsx"
          • use (Access with config.module.rule("babel").oneOf("jsx").use(useName))
            • "babel-loader"
        • "app-js"
          • use (Access with config.module.rule("babel").oneOf("app-js").use(useName))
            • "babel-loader"
        • "extra-js" (If using babel.extraBabelIncludes)
          • use (Access with config.module.rule("babel").oneOf("extra-js").use(useName))
            • "babel-loader"
        • "ts"
          • use (Access with config.module.rule("babel").oneOf("ts").use(useName))
            • "babel-loader"
        • "tsx"
          • use (Access with config.module.rule("babel").oneOf("tsx").use(useName))
            • "babel-loader"
    • "worker"
      • use (Access with config.module.rule("worker").use(useName))
        • "worker-loader"
    • "css"
      • use (Access with config.module.rule("css").use(useName))
        • "style-loader" (If using injectCSS)
        • "extract-css-loader" (If not using injectCSS)
        • "css-loader"
        • "postcss-loader"
    • "less"
      • use (Access with config.module.rule("less").use(useName))
        • "style-loader" (If using injectCSS)
        • "extract-css-loader" (If not using injectCSS)
        • "css-loader"
        • "postcss-loader"
        • "less-loader"
    • "sass"
      • use (Access with config.module.rule("sass").use(useName))
        • "style-loader" (If using injectCSS)
        • "extract-css-loader" (If not using injectCSS)
        • "css-loader"
        • "postcss-loader"
        • "resolve-url-loader"
        • "sass-loader"

env

Type: string Default: Depends on environment variables

Available values are "development" and "production". If not specified, we will determine it by process.env.DN_ENV, process.env.NODE_ENV and the dawn command executing currently in order.

Examples:

$ dn dev # set to "development" because of the command includes the "dev" string
$ dn run daily # set to "development" because of the command includes the "daily" string
$ dn run build # set to "production" because of the command neither includes the "dev" string nor includes the "daily" string
$ NODE_ENV=production dn dev # set to "production" because of process.env.NODE_ENV is "production"
$ DN_ENV=production NODE_ENV=development dn dev # set to "production" because of process.env.DN_ENV is "production"

cwd

Type: string Default: Depends on current working directory

By default cwd equals to the current working directory.

entry

Type: string | string[] | object Default: Depends on files exist in src

By default, middleware will search files src/index.tsx, src/index.ts, src/index.jsx, src/index.js in order and set entry to the first founded file path.

string

Set a single entry by path. The entry name equals the base name of the path without extension.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    entry: src/app.tsx # The entry name is "app"

string[]

Set multiple entries by path.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    entry:
      - src/foo.tsx # The entry name is "foo"
      - src/bar.tsx # The entry name is "bar"

object

Set multiple entries by name and path. Support using glob pattern in path and placeholder in name to specify multiple entries.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    entry:
      index: src/index.tsx
      page_{0}: src/pages/*.tsx

If there is a.tsx and b.tsx in src/pages/, then two entries which with name page_a and page_b will be generated together with the fixed entry index.

inject

Type: string | string[] Default: []

Prepend file(s) to all entries.

string

Simplified for single file.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    inject: src/setup.ts

string[]

One or more files.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    inject:
      - src/bootstrap.ts
      - src/initGlobal.ts

append

Type: string | string[] Default: []

Append file(s) to all entries.

string

Simplified for single file.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    append: src/cleanup.ts

string[]

One or more files.

Examples:

dev:
  - name: '@dawnjs/dn-middleware-webpack'
    append:
      - src/restore.ts
      - src/cleanup.ts

output

Type: string | object Default: { path: "./build" }

Pass to webpack output options.

string

If you provide an string, it means output.path.

object

Accept all webpack output options. Details to see here.

folders

Type: object Default: { script: "js", style: "css", media: "assets", html: "" }

Output folders for different asset type.

  • script - All js files.
  • style - All css files output by mini-css-extract-plugin.
  • html - All html files output by html-webpack-plugin.
  • media - Any files output by webpack with asset modules

disableDynamicPublicPath

Type: boolean Default: false

By default, if output.publicPath not set (means it's undefined) then a small code snippet will be prepend to all entries to determine runtime dynamic public path with current script source url.

template

Type: boolean | string | string[] | object Default: true

false

Disable the html output.

true

Scan file with path public/index.html and src/assets/index.html if it exists.

string

Specify the template file path.

template: template/custom.html

string[]

Specify multi templates, the file's basename is the template name.

template:
  - template/foo.html
  - template/bar.html

object

Specify multi templates with template name.

template:
  foo: template/a.html
  bar: template/b.html

target

Type: string | string[] | false Default:

See webpack docs.

external

Type: boolean Default: Depends on env

Defaults to false in development mode, otherwise to true.

externals

Type: object Default: Depends on env and output.library

By default, make react and react-dom as externals.

alias

Type: object Default:

See webpack docs.

tsconfigPathsPlugin

Type: object Default:

tsconfig-paths-webpack-plugin only enabled if there is a tsconfig.json file exists in the current work directory.

See plugin docs.

devtool

Type: boolean | string Default: Depends on env

If env is "development", defaults to "eval-cheap-module-source-map", otherwise defaults to "cheap-source-map".

true

Same as not set.

false

Disable source maps.

string

All available values see webpack docs.

common

Type: object Default: { disabled: false, name: 'common' }

common.disabled

Type: boolean Default: false

Set to true to disable common chunk.

common.name

Type: string Default: "common"

Set common chunk's name.

compress

Type: boolean Default: Depends on env

Default to true in "production".

esbuild

Type: object Default:

esbuild.loader

Type: boolean | object Default:

boolean

Simply enable esbuild to replace babel without options.

object

See esbuild-loader's loader options.

esbuild.minify

Type: boolean | object Default:

boolean

Simply enable esbuild to replace terser without options.

object

See esbuild-loader's minify plugin options.

swc

Type: boolean | object Default:

boolean

Simply enable swc to replace babel and terser without options.

object

See swc-loader options and swc-webpack-plugin options.

terser

Type: object Default: { extractComments: false, terserOptions: { compress: { drop_console: true }, format: { comments: false } } }

See plugin docs.

cssMinimizer

Type: object Default: { minimizerOptions: { preset: ["default", { discardComments: { removeAll: true } }] } }

See plugin docs

optimization

Type: object Default:

Extra options to override other optimization options.

See webpack docs.

ignoreMomentLocale

Type: boolean Default:

Whether to ignore locales in moment package or not, default is true.

babel

Type: object

babel.corejs

Type: false | 2 | 3 | { version: 2 | 3; proposals: boolean } Default:

See babel docs.

babel.disableAutoReactRequire

Type: boolean Default: false

Whether to use babel-plugin-react-require or not. See plugin docs.

babel.extraBabelIncludes

Type: any[] Default:

By default babel only transform application source files except files in the node_modules folder. Pass in any valid include pattern list to tell babel to transform. Include patther follow webpack module rule condition

babel.extraBabelPlugins

Type: any[] Default:

Specify extra babel plugins.

babel.extraBabelPresets

Type: any[] Default:

Specify extra babel presets.

babel.ie11Incompatible

Type: boolean Default: false

Enable IE11 compatible mode, use es5-imcompatible-versions

babel.jsxRuntime

Type: boolean Default:

Enable react's new jsx runtime syntax.

babel.pragma

Type: string Default:

See babel docs.

babel.pragmaFrag

Type: string Default:

See babel docs.

babel.runtimeHelpers

Type: boolean | string Default:

Enable transform-runtime plugin or specify the plugin version.

disabledTypeCheck

Type: boolean Default: false

By default, if there is a tsconfig.json file in current working directory, it will checking the types for typescript files. Can disable it with set disabledTypeCheck to true.

typeCheckInclude

Type: string[] Default: ["**/*"]

By default, all files will be checked. Custom glob patterns to override the range.

injectCSS

Type: boolean Default: Depends on env

If env is "development" then it defaults to true, else defaults to false.

When it is true, CSS would be injected into the DOM by style-loader, otherwise, be extracted to seperate files by mini-css-extract-plugin.

styleLoader

Type: object Default:

Options for style-loader or MiniCssExtractPlugin.loader.

See style-loader doc and MiniCssExtractPlugin.loader doc.

cssLoader

Type: object Default:

Options for css-loader. Support CSS Modules if file has extension like .module.*.

See css-loader docs.

postcssLoader

Type: object Default: { implementation: require("postcss"), postcssOptions: { plugins: ["postcss-flexbugs-fixes", "postcss-preset-env"] } }

Options for css-loader.

See postcss-loader docs

extraPostCSSPlugins

Type: any[] Default:

Extra plugins for PostCSS in postcss-loader. Only available if postcssLoader.postcssOptions is not a function.

postcssPresetEnv

Type: object Default:

Options for postcss-preset-env. Only available if postcssLoader.postcssOptions is not a function.

See postcss-preste-env docs.

lessLoader

Type: object Default: { implementation: require("less"), lessOptions: { rewriteUrls: "all" } }

Options for less-loader.

See less-loader docs.

resolveUrlLoader

Type: object Default:

Options for resolve-url-loader. resolve-url-loader only apply to SASS files. See this.

See resolve-url-loader docs.

sassLoader

Type: object Default: { implementation: require("sass"), sourceMap: true, sassOptions: { fiber: require("fibers") } }

Options for sass-loader. sassLoader.sourceMap always be true because of the requirement of resolve-url-loader. See here.

See sass-loader docs.

workerLoader

Type: object Default: { inline: "fallback" }

Options for worker-loader. Files with .worker.* extensions will be processed.

See worker-loader docs.

config

Type: object Default: { name: "$config", path: "./src/config", env: ctx.command }

Options to configure the runtime config virtual module. By default, load runtime config from src/config, src/config.* and src/config/**/* according to the specified env with any supported format. See confman.

Examples:

In ./config.yml

foo: abc

In ./src/test.ts

import config from '$config';

console.log(config.foo); // output abc

config.name

Type: string Default: "$config"

The virtual module name.

config.path

Type: string Default: "./src/config"

The path where to search config files.

config.env

Type: string Default: ctx.command

The runtime environment of config files. By default, it depends on the current running command of dawn.

Examples:

$ dn d

will load config.dev.yml because the actual command is "dev".

$ dn run my-cmd

will load config.my-cmd.yml.

config.content

Type: any Default:

Manually set the whole config content.

profile

Type: boolean Default:

Also can be enabled by setting process.env.WEBPACK_PROFILE to any nullish value.

statsOpts

Type: string | object Default: "verbose"

Options for stats in webpack-stats-plugin.

See webpack docs

analysis

Type: boolean | object Default:

Options for webpack-bundle-analyzer. Set to false to disable it. Set to true to enable it and use default options ({ analyzerMode: "server", openAnalyzer: true }). Auto enabled if profile is on.

See webpack-bundle-analyzer docs.

watch

Type: boolean Default:

Enable webpack's watch mode, unavailable in server mode.

watchOpts

Type: object Default: { ignored: /node_modules/ }

See webpack docs.

server

Type: boolean Default: Depends on env

Defaults to true if env is "development", otherwise to false.

serverOpts

Type: object Default: { host: "localhost", historyApiFallback: true, open: true, hot: true, quiet: true }

Options for webpack-dev-server. Support custom server with server.* in current working directory, or with a directory server/ and several config files.

Examples:

# server.yml
host: 127.0.0.1
port: 8001
https: true
proxy:
  /api: https://localhost:3000
  /api2:
    target: https://localhost:3001
    pathRewrite:
      ^/api2: /v2

See webpack docs.