Typescript + Webpack + node_modules解析

时间:2017-09-09 01:18:58

标签: typescript webpack dependencies node-modules resolve

我有一个我正在研究的项目 - 用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依赖项。

客户端tsconfig.json:

{
    "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"
    ]
}

客户端webpack.config.js

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" }
        ]
    }
};

2 个答案:

答案 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,
};