Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.

Automatically use appropriate webpack mode based on run/build #94

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ kotlinFrontend {
port = 8088 // dev server port
proxyUrl = "" | "http://...." // URL to be proxied, useful to proxy backend webserver
stats = "errors-only" // log level
mode = "production" | "development" | "none" // used for webpack 4+ built-in optimizations
}
}
```
Expand All @@ -116,6 +117,8 @@ dev server log is located at `build/logs/webpack-dev-server.log`

config file is generated at `build/webpack.config.js`

If mode is not specified, the default behavior is to use development mode for running the dev server, and production mode for creating the final bundle. See [webpack documentation](https://webpack.js.org/concepts/mode/) for more information about modes.

## webpack configuration customization

To customize webpack configuration, you can apply additional scripts by placing them in the directory `webpack.config.d`. The scripts will be appended to the end of config script. Use number prefix to change order (it is very similar to UNIX rc.d config directories)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.jetbrains.kotlin.gradle.frontend.npm

import groovy.json.JsonSlurper
import org.gradle.api.GradleException
import org.gradle.api.Project
import kotlin.reflect.KProperty

class NpmModuleVersion(project: Project, module: String) {
@Suppress("UNCHECKED_CAST")
val version: String = project.buildDir.resolve("node_modules/$module/package.json")
.let { JsonSlurper().parse(it) as Map<String, Any?> }["version"]
?.let { it as String } ?: throw GradleException("Module \"$module\" not found")

val major: Int by VersionComponent(0)

val minor: Int by VersionComponent(1)

val patch: Int by VersionComponent(2)

private class VersionComponent(val component: Int) {
operator fun getValue(thisRef: NpmModuleVersion, property: KProperty<*>): Int {
return thisRef.version.split(".")
.getOrNull(component)
?.toInt() ?: 0
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ open class GenerateWebPackConfigTask : DefaultTask() {
val resolveRoots = getModuleResolveRoots(false)

val json = linkedMapOf(
"mode" to bundle.mode,
"context" to getContextDir(false).absolutePath,
"entry" to mapOf(
bundle.bundleName to kotlinOutput(project).nameWithoutExtension.let { "./$it" }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.jetbrains.kotlin.gradle.frontend.webpack

import groovy.json.JsonSlurper
import org.gradle.api.*
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.gradle.frontend.npm.NpmModuleVersion
import org.jetbrains.kotlin.gradle.frontend.util.*

/**
Expand All @@ -29,23 +29,15 @@ open class WebPackBundleTask : DefaultTask() {

@TaskAction
fun buildBundle() {
@Suppress("UNCHECKED_CAST")
val webpackVersion = project.buildDir.resolve("node_modules/webpack/package.json")
.let { JsonSlurper().parse(it) as Map<String, Any?> }["version"]
?.let { it as String }

val processBuilderCommands = arrayListOf(
nodePath(project, "node").first().absolutePath,
project.buildDir.resolve("node_modules/webpack/bin/webpack.js").absolutePath,
"--config", webPackConfigFile.absolutePath
)
val webpackMajorVersion = webpackVersion
?.split('.')
?.firstOrNull()
?.toInt()
if (webpackMajorVersion != null && webpackMajorVersion >= 4) {

if (NpmModuleVersion(project, "webpack").major >= 4) {
processBuilderCommands.addAll(arrayOf(
"--mode", config.mode
"--mode", config.mode ?: "production"
))
}
ProcessBuilder(processBuilderCommands)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,6 @@ open class WebPackExtension(project: Project) : BundleConfig {
var webpackConfigFile: Any? = null

@Input
var mode: String = "development"
@Optional
var mode: String? = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import groovy.json.*
import org.codehaus.groovy.runtime.*
import org.gradle.api.*
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.gradle.frontend.npm.NpmModuleVersion
import org.jetbrains.kotlin.gradle.frontend.servers.*
import org.jetbrains.kotlin.gradle.frontend.util.*
import java.io.*
Expand Down Expand Up @@ -77,6 +78,9 @@ open class WebPackRunTask : AbstractStartStopTask<WebPackRunTask.State>() {
.replace("require('\$RunConfig\$')",
JsonBuilder(GenerateWebpackHelperTask.config(project, config, webPackConfigFile)).toPrettyString()
)
.replace("\$SetMode\$\n",
if (NpmModuleVersion(project, "webpack").major >= 4) "config.mode = \"${config.mode ?: "development"}\";\n" else ""
)
)

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var devServerVersion = require(__dirname + '/node_modules/webpack-dev-server/pac
var RunConfig = require('$RunConfig$');

var config = require(RunConfig.webPackConfig);
$SetMode$

for (var name in config.entry) {
if (config.entry.hasOwnProperty(name)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ class SimpleFrontendProjectTest(gradleVersion: String, kotlinVersion: String) :
block("webpackBundle") {
line("port = $port")
line("bundleName = \"main\"")
line("mode = \"development\"")
}
}

Expand Down