我有一个我正在研究的项目 - 用Typescript(2.4)编写,与Webpack(3.5)捆绑在一起,以及一些节点依赖项。它有一个Client和Server部分,每个部分都在它自己的子文件夹中。我很快意识到这些代码共享了很多代码,并添加了另一个顶级“共享”文件夹 - 在tsconfig.json
个文件中,我添加了:
...
"include": [
"*.ts",
"../shared/*.ts",
]
...
所有这些都很有效 - 但很快这些共享文件开始具有自己的依赖关系。我认为,由于共享文件并非真正构建在自己身上 - 依赖项的所有权属于Server和Client目录。像这样:
project
| server
| | node_modules
| | | @types
| | | | some-npm-library
| | | some-npm-library
| | main.ts
| | SomeServerClass.ts (inherits ../shared/BaseClass)
| | tsconfig.json
| | webpack.config.js
| client
| | node_modules
| | | @types
| | | | some-npm-library
| | | some-npm-library
| | main.ts
| | SomeClientClass.ts (inherits ../shared/BaseClass)
| | tsconfig.json
| | webpack.config.js
| shared
| | BaseClass.ts (Has an dependency on some npm thing)
| | otherstuff.ts
当我运行tsc
时 - 它编译时没有错误。但是webpack似乎找不到具有Error: Can't resolve 'some-npm-library'
的node_modules依赖项。
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"baseUrl": "./",
"sourceMap": true,
"outDir": "./build",
"typeRoots": ["./node_modules/@types"],
"types": ["some-npm-library"],
"lib": [ "es6", "dom", "es2017.object", "es2016.array.include" ]
},
"include": [
"*.ts",
"..shared/**.ts"
]
}
const path = require('path');
module.exports = {
entry: "./main.ts",
target: "web",
output: {
filename: "app.js",
path: __dirname + "/bin"
},
watch: true,
devtool: "source-map",
resolve: {
extensions: [".ts", ".js", ".json"],
},
module: {
rules: [
{ test: /\.ts$/, loader: "ts-loader" },
{ enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
]
}
};
答案 0 :(得分:0)
我找到了一个解决方案 - 它可能对类似情况下的其他人不起作用 - 但我使用了Webpack的Resolve.alias。通过添加如下行:
li a {
font-size: 16px; // or any other value
}
这将使webpack看到alias: {
'npm-library': path.resolve(__dirname, 'node_modules/npm-library/')
}
并识别它 - 尽管该共享文件夹中没有npm库。
我还尝试将依赖项安装到共享文件夹中 - 而不是单独安装客户端和服务器 - 问题是我会有重复的依赖项。但要小心避免这种情况也可能有效。
答案 1 :(得分:0)
将此webpack.config.ts文件与正确的文件路径一起使用:
var fs = require('fs');
var path = require('path');
var nodeModules = {};
fs.readdirSync('node_modules')
.filter(function (x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function (mod) {
nodeModules[mod] = 'commonjs ' + mod;
});
module.exports = {
entry: './app/server.ts',
mode: 'development',
output: {
path: __dirname + '/dist',
publicPath: '/',
filename: 'server.js',
},
resolve: {
// Add '.ts' and '.tsx' as a resolvable extension.
extensions: ['.webpack.js', '.web.js', '.ts', '.tsx', '.js'],
},
module: {
// loaders: [
rules: [
// All files with a '.ts' or '.tsx'
// extension will be handled by 'ts-loader'
{
test: /\.tsx?$/,
loader: 'ts-loader',
},
],
},
target: 'node',
externals: nodeModules,
};