ค้นหาเว็บไซต์

javascript - การนำเข้า Webpack/ts-loader ที่มีนามสกุล .js ไม่สามารถแก้ไขได้


โครงสร้างไดเรกทอรีของฉันมีดังนี้:

projectRoot
├── project-server
│   ├── src
│   └── pom.xml
├── project-ui
│   ├── tsconfig.json
│   └── src
│       └── file.ts.  (imports ./file.js)

ปัญหาของฉันคือ project-server ใช้ไฟล์ js ที่ถูกแปลงแล้วและดังนั้นต้องการนามสกุล .js เพื่อระบุไฟล์ได้ถูกต้อง ฉันกำลังใช้ webpack-dev-server สำหรับการพัฒนาและใช้ ts-loader แต่ฉันได้รับข้อผิดพลาดว่า:

Module not found: Error: Can't resolve './file.js' in 
'/projectRoot/project-ui/src'

ต่อไปนี้คือ webpack.config.js ของฉัน:

module.exports = {
  entry: './project-ui/src/file1.ts',
  mode: "development",
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: 'ts-loader',
        exclude: /node_modules/
      },
      ... other rules
    ]
  },
  resolve: {
    extensions: ['.js', '.ts'],
  }

ไฟล์ tsconfig.json ของฉันมีการตั้งค่าที่เฉพาะเจาะจงกับตำแหน่งที่ project-server ต้องการไฟล์ js กล่าวคือ "outDir": "../project-server/src/main/resources/static"

ดังนั้นฉันจึงไม่แน่ใจว่าต้องกำหนดค่า Webpack/ts-loader อย่างไรเพื่อให้สามารถแก้ไขคำสั่ง import ได้อย่างถูกต้อง

คำตอบ #1

อัปเดตล่าสุดเมื่อวันที่ 20-10-2022

Webpack v5.74.0 ถูกปล่อยออกมาในเดือนกรกฎาคม 2022 และมันรวมตัวเลือกใหม่ resolve.extensionAlias ซึ่งให้วิธีแก้ปัญหานี้

ตัวอย่างเช่น:

resolve: {
    extensionAlias: {
        '.js': ['.js', '.ts'],
    },
}

ตอบ ณ วันที่ 1 กันยายน 2021

ฉันกำลังเผชิญกับปัญหาแบบเดียวกันในขณะนี้ ตอนนี้ฉันกลัวว่าจะไม่มีคำตอบที่ดีให้คุณ แต่ฉันพบการสนทนาจากปี 2017 ที่กล่าวว่า ts-loader ไม่รองรับพฤติกรรมนี้:

https://github.com/microsoft/TypeScript/issues/16577#issuecomment-343649391

ถ้ามีการเพิ่มการสนับสนุนตั้งแต่นั้นมา ฉันยังไม่สามารถหาข้อมูลรายละเอียดเกี่ยวกับมันได้เลย

อย่างไรก็ตาม ฉันประสบความสำเร็จบ้างกับการตั้งค่า alias ในส่วน resolve.alias ของ webpack.config.js ของฉัน ดังนั้นเส้นทางสัมพัทธ์ไปยังไฟล์บางไฟล์ที่ใช้ .js จะถูก Webpack แปลงไปยังไฟล์ .ts ที่เทียบเท่า ตัวอย่างเช่น:

alias: {
    './file-processing.js': './file-processing.ts',
},

แต่นี่เป็นวิธีแก้ปัญหาที่เกะกะมากและไม่สามารถขยายได้เลย

คำตอบ #2

ts-loader ไม่รองรับการมีการนำเข้าด้วยนามสกุล .js โดยตรง ดังนั้นโปรเจกต์นี้ https://github.com/softwareventures/resolve-typescript-plugin จึงให้ขั้นตอนเพิ่มเติมที่จำเป็นเพื่อให้สิ่งนี้ทำงานได้

บทความที่เกี่ยวข้อง