15

使用 webpack ^v2.2.1,除了“正常”导入相同的模块之外,我还想将 TypeScript 模块作为文本导入。

我想我可能应该使用raw-loader。但这行不通。

一些示例代码:

import DemoComponent from './demo'
import demoCode from 'raw-loader!./demo'

TypeScript 对我大喊大叫,比如

error TS2307: Cannot find module 'raw-loader!./demo'.

我正在使用ts-loader

这是我的webpack.config.js

const { resolve } = require('path')
const fail = require('webpack-fail-plugin')

const config = {
  entry: './docs/index.ts',
  output: {
    filename: 'bundle.js',
    path: resolve(__dirname, 'docs-build')
  },
  resolve: {
    extensions: [ '.ts', '.js' ]
  },
  devtool: 'inline-source-map',
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        loader: 'source-map-loader'
      },
      {
        test: /\.ts$/,
        loader: 'ts-loader'
      },
      {
        test: /\.scss$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              sourceMap: true
            }
          },
          'sass-loader'
        ]
      }
    ]
  },
  plugins: [
    fail
  ]
}

module.exports = config
4

4 回答 4

17

如果有人正在寻找这个答案的解决方案。Using是最好的选择 - 它将被输入并允许在输出vsimport时从模块捆绑器(如 Rollup 和 Webpack 3+)进行优化:importrequire

您需要创建一个raw-loader.d.ts并确保它包含在您的tsconfig.json文件中。输入以下内容:

declare module '!!raw-loader!*' {
  const contents: string
  export = contents
}

tsconfig.json

{
    "compilerOptions": {
        "types": ["raw-loader.d.ts", "node"]
    }
}
于 2018-03-12T13:03:23.030 回答
3

似乎以下工作有效:

import DemoComponent from './demo'
const demoCode = require('!!raw-loader!./demo')

但我不确定这有多正确。我很想找到一些关于加载程序的顺序和机制的文档。

另外,我更愿意通过使用import语句来保持一致。但是如果我进行直接转换,TypeScript 会抱怨它:

import DemoComponent from './demo'
import demoCode from '!!raw-loader!./demo'

错误很简单

error TS2307: Cannot find module '!!raw-loader!./demo'.
于 2017-03-06T18:40:48.617 回答
1

我在这里写了一个完整的解释: https ://yonatankra.com/how-to-solve-ts2307-cannot-find-module-when-using-inline-webpack-loaders-with-typescript/

总之:

您可以使用以下语法导入:import template from 'raw-loader!./component.template.html';

要使其适用于任何类型的文件,您需要:

  1. 设置模块声明: raw-loader.d.ts
declare module '!!raw-loader!*' {
  const contents: string
  export default contents
}
  1. 在您的中使用它tsConfig.json并添加allowSyntheticDefaultImports属性以允许以这种方式导入没有默认导出的模块:
{
  "compilerOptions": {
    "types": ["raw-loader.d.ts", "node"],
    "allowSyntheticDefaultImports": true
}

在文章中,我还解释了如果(出于某种真正奇怪的原因)您想使用template.default.

于 2021-09-08T06:33:48.980 回答
0

对于您的错误:

raw-loader.d.ts

declare module '!!raw-loader!*' {
  const contents: string
  export default contents
}
于 2019-06-07T00:32:10.623 回答