具有 client/server 节点设置的 Webpack?
Webpack with a client/server node setup?
我正在尝试为具有节点后端服务器的 Angular2 应用程序设置基于 webpack 的流程。经过几个小时的努力,我设法让客户端愉快地构建,但我不知道现在如何集成我的服务器构建。我的服务器使用生成器,因此必须以 ES6 为目标,并且它需要指向不同的类型文件(main.d.ts 而不是 browser.d.ts)..
我的源代码树看起来像;
/
-- client/
-- -- <all my angular2 bits> (*.ts)
-- server/
-- -- <all my node/express bits> (*.ts)
-- webpack.config.js
-- typings/
-- -- browser.d.ts
-- -- main.d.ts
我想也许客户端和服务器文件夹中的 tsconfig.json 可以工作,但运气不好。我也找不到让 html-webpack-plugin 忽略我的服务器包而不是将其注入 index.html 的方法。我当前的 tsconfig 和 webpack 在下面,但是有没有人成功地让 webpack 捆绑这样的设置?任何指针将不胜感激。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"declaration": false,
"removeComments": true,
"noEmitHelpers": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"files": [
"typings/browser.d.ts",
"client/app.ts",
"client/bootstrap.ts",
"client/polyfills.ts"
]
}
和我的 webpack.config.js;
var Webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var Path = require('path');
module.exports = {
entry: {
'polyfills': Path.join(__dirname, 'client', 'polyfills.ts'),
'client': Path.join(__dirname, 'client', 'bootstrap.ts')
},
output: {
path: Path.join(__dirname, 'dist'),
filename: '[name].bundle.js'
},
resolve: {
extensions: ['', '.js', '.json', '.ts']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts-loader',
query: {
ignoreDiagnostics: [
2403, // 2403 -> Subsequent variable declarations
2300, // 2300 -> Duplicate identifier
2374, // 2374 -> Duplicate number index signature
2375, // 2375 -> Duplicate string index signature
]
}
},
{ test: /\.json$/, loader: 'raw' },
{ test: /\.html$/, loader: 'raw' },
{ test: /\.css$/, loader: 'raw!postcss' },
{ test: /\.less$/, loSWE: 'raw!postcss!less' }
]
},
plugins: [
new HtmlWebpackPlugin({ template: 'client/index.html', filename: 'index.html' }),
new Webpack.optimize.CommonsChunkPlugin('common', 'common.bundle.js')
]
};
就个人而言,我倾向于用纯 JS 编写我的服务器端代码(大部分 ES2015 现在可以在 Node 中使用)和我的 Angular 2 应用程序在 Typescript 中,所以这个问题不会出现。然而,你可以让它与 Webpack 一起工作。
首先,您应该有两个独立的 Webpack 配置:一个用于客户端代码,一个用于服务器端。也许可以用一个配置来完成,但即使是,也可能比它的价值更麻烦。确保在服务器端配置中设置 target: 'node'
(target: 'web'
会自动为客户端设置)。并确保为您的服务器端文件设置一个 entry
点(我在上面没有看到,但无论如何您最终都会在单独的配置中使用它)。
其次,你需要有多个tsconfig文件。默认情况下,ts-loader
将在您的根目录中查找 tsconfig.json
。但是,you can tell specify another file 通过在选项对象中设置 configFileName: 'path/to/tsconfig'
或查询 string/object.
但这可能会导致另一个问题。您的 IDE 也会在您的根目录中查找您的 tsconfig.json
文件。如果您有两个单独的文件,您将需要一些方法来告诉您的 IDE 给定文件使用哪个文件。解决方案将取决于您的 IDE。就个人而言,我将 Atom 与 atom-typescript
一起使用,这很棒,但看起来多个 tsconfig 文件的事情是 still being worked on。谢天谢地,我从来不用担心这个问题。
至于 html-webpack-plugin
问题,您不必担心,因为您不会在服务器端配置中包含该插件。但是,仅供参考,您可以将 excludeChunks: ['someChunkName']
传递给 omit certain chunks,使其不包含在脚本标签中。
我正在尝试为具有节点后端服务器的 Angular2 应用程序设置基于 webpack 的流程。经过几个小时的努力,我设法让客户端愉快地构建,但我不知道现在如何集成我的服务器构建。我的服务器使用生成器,因此必须以 ES6 为目标,并且它需要指向不同的类型文件(main.d.ts 而不是 browser.d.ts)..
我的源代码树看起来像;
/
-- client/
-- -- <all my angular2 bits> (*.ts)
-- server/
-- -- <all my node/express bits> (*.ts)
-- webpack.config.js
-- typings/
-- -- browser.d.ts
-- -- main.d.ts
我想也许客户端和服务器文件夹中的 tsconfig.json 可以工作,但运气不好。我也找不到让 html-webpack-plugin 忽略我的服务器包而不是将其注入 index.html 的方法。我当前的 tsconfig 和 webpack 在下面,但是有没有人成功地让 webpack 捆绑这样的设置?任何指针将不胜感激。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"declaration": false,
"removeComments": true,
"noEmitHelpers": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"files": [
"typings/browser.d.ts",
"client/app.ts",
"client/bootstrap.ts",
"client/polyfills.ts"
]
}
和我的 webpack.config.js;
var Webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var Path = require('path');
module.exports = {
entry: {
'polyfills': Path.join(__dirname, 'client', 'polyfills.ts'),
'client': Path.join(__dirname, 'client', 'bootstrap.ts')
},
output: {
path: Path.join(__dirname, 'dist'),
filename: '[name].bundle.js'
},
resolve: {
extensions: ['', '.js', '.json', '.ts']
},
module: {
loaders: [
{
test: /\.ts$/,
loader: 'ts-loader',
query: {
ignoreDiagnostics: [
2403, // 2403 -> Subsequent variable declarations
2300, // 2300 -> Duplicate identifier
2374, // 2374 -> Duplicate number index signature
2375, // 2375 -> Duplicate string index signature
]
}
},
{ test: /\.json$/, loader: 'raw' },
{ test: /\.html$/, loader: 'raw' },
{ test: /\.css$/, loader: 'raw!postcss' },
{ test: /\.less$/, loSWE: 'raw!postcss!less' }
]
},
plugins: [
new HtmlWebpackPlugin({ template: 'client/index.html', filename: 'index.html' }),
new Webpack.optimize.CommonsChunkPlugin('common', 'common.bundle.js')
]
};
就个人而言,我倾向于用纯 JS 编写我的服务器端代码(大部分 ES2015 现在可以在 Node 中使用)和我的 Angular 2 应用程序在 Typescript 中,所以这个问题不会出现。然而,你可以让它与 Webpack 一起工作。
首先,您应该有两个独立的 Webpack 配置:一个用于客户端代码,一个用于服务器端。也许可以用一个配置来完成,但即使是,也可能比它的价值更麻烦。确保在服务器端配置中设置 target: 'node'
(target: 'web'
会自动为客户端设置)。并确保为您的服务器端文件设置一个 entry
点(我在上面没有看到,但无论如何您最终都会在单独的配置中使用它)。
其次,你需要有多个tsconfig文件。默认情况下,ts-loader
将在您的根目录中查找 tsconfig.json
。但是,you can tell specify another file 通过在选项对象中设置 configFileName: 'path/to/tsconfig'
或查询 string/object.
但这可能会导致另一个问题。您的 IDE 也会在您的根目录中查找您的 tsconfig.json
文件。如果您有两个单独的文件,您将需要一些方法来告诉您的 IDE 给定文件使用哪个文件。解决方案将取决于您的 IDE。就个人而言,我将 Atom 与 atom-typescript
一起使用,这很棒,但看起来多个 tsconfig 文件的事情是 still being worked on。谢天谢地,我从来不用担心这个问题。
至于 html-webpack-plugin
问题,您不必担心,因为您不会在服务器端配置中包含该插件。但是,仅供参考,您可以将 excludeChunks: ['someChunkName']
传递给 omit certain chunks,使其不包含在脚本标签中。