关于 Webpack & Maven 的说明
Webpack & Maven 的说明。
引言
这是关于 Webpack & Maven 的一篇说明。
背景
Webpack 近来是一个流行的 Web 开发工具,而 Maven 则是一个流行的应用程序构建和打包工具,已有一十多年历史。在这篇说明中,我将讨论以下两个问题。
- 如何使用 Maven 启动 Webpack,并将打包后的文件放置在项目的正确位置,以便 Maven 进一步将其打包到 WAR 文件中。
- 如何解决 IDE 的一些问题。在这篇说明中,我将仅讨论 Eclipse。
附件是一个简单的 Webpack 风格的 Vue 应用程序。我将使用 Maven 来启动 Webpack,并将打包后的文件放入 "WebContent" 文件夹中,以便 Maven 进一步将其打包到 WAR 文件中。Maven 有许多运行 Webpack 的方法,在这篇说明中,我将使用 "frontend-maven-plugin"。
Vue 应用
Vue 应用程序与我之前说明中的示例相同。这篇说明是关于 Webpack & Maven 的,而不是 Webpack 本身。我不会在示例上花费太多时间。如果您感兴趣,可以查看我之前的说明,或者更好的是,查看 Vue 官方文档。Vue 应用程序的 "package.json" 文件如下所示:
{
"name": "a-vue-example-wpack",
"description": "a-vue-example-wpack-version",
"version": "1.0.0",
"author": "Song Li",
"license": "MIT",
"private": true,
"scripts": {
"build-dev": "cross-env NODE_ENV=dev webpack --color",
"build-dev-w": "cross-env NODE_ENV=dev webpack --color --watch",
"build-prod": "cross-env NODE_ENV=production webpack --hide-modules"
},
"dependencies": {
"vue": "^2.5.11"
},
"devDependencies": {
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-preset-env": "^1.6.0",
"babel-preset-stage-3": "^6.24.1",
"cross-env": "^5.0.5",
"css-loader": "^0.28.7",
"file-loader": "^1.1.4",
"vue-loader": "^13.0.5",
"vue-template-compiler": "^2.4.4",
"webpack": "^3.6.0",
"webpack-dev-server": "^2.9.1",
"url-loader": "0.6.2"
}
}
除了 NPM 依赖之外,"package.json" 还定义了三个脚本:
- "
build-dev
" - 执行此脚本将以开发模式运行 Webpack,打包的文件不会被压缩。 - "
build-dev-w
" - 执行此脚本将以开发模式运行 Webpack,打包的文件不会被压缩。同时,会在源文件上启动一个监视器。每当源文件被修改时,Webpack 都会重新生成打包文件。这在您开发代码时非常有用,这样您就不必重新构建整个应用程序来测试您的代码。 - "
build-prod
" - 执行此脚本将以生产模式运行 Webpack,打包的文件会被压缩。对于大型应用程序,压缩过程通常是一个耗时的过程。
"webpack.config.js" 定义了 Webpack 如何生成打包文件。
var path = require('path')
var webpack = require('webpack')
module.exports = {
entry: './app/main.js',
output: {
path: path.resolve(__dirname, '../WebContent/Vue-app'),
publicPath: '/vue-components/dist/', filename: 'build.js'
},
module: {
rules: [
{ test: /\.css$/, use: [ 'vue-style-loader', 'css-loader' ] },
{ test: /\.vue$/, loader: 'vue-loader', options: { loaders: {} } },
{ test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } },
{
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
use: [{ loader: 'url-loader', options: { limit: 10240 } }]
}
]
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}, extensions: ['*', '.js', '.vue', '.json']
}
};
if (process.env.NODE_ENV === 'production') {
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.optimize.UglifyJsPlugin({})])}
- "
output.path = path.resolve(__dirname, '../WebContent/Vue-app')
" 条目告诉 Webpack 将打包文件放在 "WebContent/Vue-app" 文件夹中,以便 Maven 可以将其打包到 WAR 文件中; - "
output.filename = 'build.js
'" 条目告诉 Webpack 将打包文件命名为 "build.js"。
最后,"index.html" 文件将使用 "build.js" 文件在浏览器中显示 Vue 组件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>vue-wpack-maven</title>
<style type="text/css">
* {
box-sizing: border-box;
}
</style>
</head>
<body>
<div id="app"></div>
<script src="Vue-app/build.js"></script>
</body>
</html>
Webpack & Maven
要在 Maven 构建过程中运行 Webpack,我们可以在 "pom.xml" 中添加 "frontend-maven-plugin"。
<build>
<plugins>
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>install-node-and-npm</id>
<goals><goal>install-node-and-npm</goal></goals>
<phase>generate-resources</phase>
</execution>
<execution>
<id>npm-install</id>
<goals><goal>npm</goal></goals>
<configuration>
<arguments>-prefix Vue-app/ install</arguments>
</configuration>
</execution>
<execution>
<id>webpack-build</id>
<goals><goal>npm</goal></goals>
<configuration>
<arguments>-prefix Vue-app/ run build-prod</arguments>
</configuration>
</execution>
</executions>
<configuration>
<nodeVersion>v8.11.1</nodeVersion>
<npmVersion>5.6.0</npmVersion>
</configuration>
</plugin>
</plugins>
</build>
- 在 "
install-node-and-npm
" 执行步骤中,该插件将下载 NPM 到本地计算机。如果 NPM 已经被先前的构建下载过,则会跳过下载。 - 在 "
npm-install
" 执行步骤中,该插件将运行 "npm install
" 来下载 "package.json" 文件中定义的 "node_modules
"。如果 "node_modules
" 已经被先前的构建下载过,则会跳过下载。 - 在 "
webpack-build
" 执行步骤中,该插件将运行 Webpack 并以生产模式将 Vue 应用程序打包到 "WebContent/Vue-app" 文件夹中,供 Maven 打包到 WAR 文件。
您可以发出以下命令来执行完整的 Maven 构建。
mvn clean install
如果构建成功完成,您将获得一个 WAR 文件。如果您解压缩 WAR 文件,您应该会看到 "build.js" 文件已整齐地打包到正确的文件夹中。如果您部署并运行应用程序,您应该会看到应用程序在浏览器中运行良好。
IDE - Eclipse
"frontend-maven-plugin" 将 NPM 下载到 "node" 文件夹,并将 "package.json" 依赖项下载到 "node_modules" 文件夹。这两个文件夹非常大,大到 Eclipse 无法处理。为了让 Eclipse 正常运行,您最好在 Eclipse 资源过滤器中排除它们。
在开发过程中,您需要不断修改组件。您通常不希望执行耗时的完整 Maven 构建。在成功的 Maven 构建之后,NPM 的一个副本会被下载到应用程序根文件夹中的 "node" 文件夹,即您找到 "pom.xml" 的那个文件夹。您可以直接发出以下命令来创建一个开发打包文件。
node/npm -prefix Vue-app/ run build-dev
由 "build-dev
" 生成的 "build.js" 文件会跳过压缩过程,因此 Webpack 运行速度更快。
node/npm -prefix Vue-app/ run build-dev-w
您还可以选择为组件的源文件设置监视器。每当您对组件中的文件进行更改时,Webpack 都会重新生成 "build.js" 文件。通过监视器,Webpack 针对速度进行了优化。对于一个相当大的应用程序,在您对组件文件进行任何更改后,Webpack 打包文件的重新生成几乎是瞬时的。
关注点
- 这是关于 Webpack & Maven 的一篇说明。
- 希望您喜欢我的博文,并希望这篇笔记能以某种方式帮助您。
历史
- 2018/4/1/4:首次修订