diff --git a/Cargo.lock b/Cargo.lock
index bd48eb2311bf..bdf3f0a26914 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -103,17 +103,6 @@ version = "1.0.0-beta.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72"
 
-[[package]]
-name = "arca"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f915ddd863ef73f11c10c75170e86db1d4f539689bc6bfb9ce25d6528d6fe83"
-dependencies = [
- "clean-path",
- "path-slash",
- "radix_trie",
-]
-
 [[package]]
 name = "arrayref"
 version = "0.3.7"
@@ -270,21 +259,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "bit-set"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
-dependencies = [
- "bit-vec",
-]
-
-[[package]]
-name = "bit-vec"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
-
 [[package]]
 name = "bitflags"
 version = "1.3.2"
@@ -451,16 +425,9 @@ dependencies = [
  "android-tzdata",
  "iana-time-zone",
  "num-traits",
- "serde",
  "windows-targets 0.52.0",
 ]
 
-[[package]]
-name = "clean-path"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aaa6b4b263a5d737e9bf6b7c09b72c41a5480aec4d7219af827f6564e950b6a5"
-
 [[package]]
 name = "color-backtrace"
 version = "0.6.1"
@@ -477,15 +444,6 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609"
 
-[[package]]
-name = "concurrent_lru"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7feb5cb312f774e8a24540e27206db4e890f7d488563671d24a16389cf4c2e4e"
-dependencies = [
- "once_cell",
-]
-
 [[package]]
 name = "console"
 version = "0.15.8"
@@ -819,7 +777,6 @@ dependencies = [
  "ident_case",
  "proc-macro2",
  "quote",
- "strsim",
  "syn 2.0.63",
 ]
 
@@ -905,7 +862,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
 dependencies = [
  "powerfmt",
- "serde",
 ]
 
 [[package]]
@@ -1020,12 +976,6 @@ version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
 
-[[package]]
-name = "endian-type"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d"
-
 [[package]]
 name = "enum-iterator"
 version = "0.7.0"
@@ -1100,17 +1050,6 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
 
-[[package]]
-name = "fancy-regex"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2"
-dependencies = [
- "bit-set",
- "regex-automata 0.4.4",
- "regex-syntax 0.8.3",
-]
-
 [[package]]
 name = "fast-glob"
 version = "0.4.0"
@@ -2182,15 +2121,6 @@ version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
 
-[[package]]
-name = "nibble_vec"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43"
-dependencies = [
- "smallvec",
-]
-
 [[package]]
 name = "nom"
 version = "7.1.3"
@@ -2424,12 +2354,6 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef"
 
-[[package]]
-name = "path-slash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42"
-
 [[package]]
 name = "pathdiff"
 version = "0.2.1"
@@ -2622,26 +2546,6 @@ dependencies = [
  "syn 2.0.63",
 ]
 
-[[package]]
-name = "pnp"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46770cee76a618023fea15411d0449dd066dc232cc17e4562f154da215f27af7"
-dependencies = [
- "arca",
- "byteorder",
- "concurrent_lru",
- "fancy-regex",
- "lazy_static",
- "miniz_oxide",
- "pathdiff",
- "regex",
- "serde",
- "serde_json",
- "serde_with",
- "thiserror",
-]
-
 [[package]]
 name = "portable-atomic"
 version = "1.3.3"
@@ -2798,16 +2702,6 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426"
 
-[[package]]
-name = "radix_trie"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd"
-dependencies = [
- "endian-type",
- "nibble_vec",
-]
-
 [[package]]
 name = "rand"
 version = "0.8.5"
@@ -4055,9 +3949,9 @@ dependencies = [
 
 [[package]]
 name = "rspack_resolver"
-version = "0.2.0"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b8d0561f259e68831d67b50017eea1a03955fb37332d8e1c3a5a9f7662c036c"
+checksum = "f26478f9e708a84a3122e7d1fffea1271ac4bd61cbb5722ee41d32e29ac714f7"
 dependencies = [
  "cfg-if",
  "dashmap 6.0.1",
@@ -4065,7 +3959,6 @@ dependencies = [
  "indexmap 2.2.6",
  "json-strip-comments",
  "once_cell",
- "pnp",
  "rustc-hash 2.0.0",
  "serde",
  "serde_json",
@@ -4352,36 +4245,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "serde_with"
-version = "3.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857"
-dependencies = [
- "base64 0.22.1",
- "chrono",
- "hex",
- "indexmap 1.9.3",
- "indexmap 2.2.6",
- "serde",
- "serde_derive",
- "serde_json",
- "serde_with_macros",
- "time",
-]
-
-[[package]]
-name = "serde_with_macros"
-version = "3.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350"
-dependencies = [
- "darling 0.20.6",
- "proc-macro2",
- "quote",
- "syn 2.0.63",
-]
-
 [[package]]
 name = "serde_yaml"
 version = "0.9.34+deprecated"
diff --git a/crates/rspack_core/Cargo.toml b/crates/rspack_core/Cargo.toml
index 40e0d73685ac..949dc21c4f62 100644
--- a/crates/rspack_core/Cargo.toml
+++ b/crates/rspack_core/Cargo.toml
@@ -38,7 +38,7 @@ rspack_loader_runner = { version = "0.1.0", path = "../rspack_loader_runner" }
 rspack_macros = { version = "0.1.0", path = "../rspack_macros" }
 rspack_paths = { version = "0.1.0", path = "../rspack_paths" }
 rspack_regex = { version = "0.1.0", path = "../rspack_regex" }
-rspack_resolver = { version = "0.2.0", features = ["package_json_raw_json_api", "yarn_pnp"] }
+rspack_resolver = { version = "0.3.0", features = ["package_json_raw_json_api"] }
 rspack_sources = { workspace = true }
 rspack_util = { version = "0.1.0", path = "../rspack_util" }
 rustc-hash = { workspace = true }
diff --git a/crates/rspack_core/src/resolver/resolver_impl.rs b/crates/rspack_core/src/resolver/resolver_impl.rs
index a98e72a608c0..d5dee9f54163 100644
--- a/crates/rspack_core/src/resolver/resolver_impl.rs
+++ b/crates/rspack_core/src/resolver/resolver_impl.rs
@@ -283,7 +283,6 @@ fn to_rspack_resolver_options(
     roots,
     builtin_modules: false,
     imports_fields,
-    pnp_manifest: None,
   }
 }
 
diff --git a/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/index.js b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/index.js
new file mode 100644
index 000000000000..fb2ec0249272
--- /dev/null
+++ b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/index.js
@@ -0,0 +1,5 @@
+import { foo } from 'invalid-pkg'
+
+it("should fallback from module to main when resolve failed", () => {
+  expect(foo).toBe(42);
+});
\ No newline at end of file
diff --git a/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/exist.js b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/exist.js
new file mode 100644
index 000000000000..055071cb82c7
--- /dev/null
+++ b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/exist.js
@@ -0,0 +1,3 @@
+module.exports = {
+    foo: 42
+}
\ No newline at end of file
diff --git a/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/package.json b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/package.json
new file mode 100644
index 000000000000..b6239897bfad
--- /dev/null
+++ b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/node_modules/invalid-pkg/package.json
@@ -0,0 +1,5 @@
+{
+    "name": "invalid-pkg",
+    "main": "./exist.js",
+    "module": "./non-exist.js"
+}
\ No newline at end of file
diff --git a/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/rspack.config.js b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/rspack.config.js
new file mode 100644
index 000000000000..287e66640de9
--- /dev/null
+++ b/packages/rspack-test-tools/tests/configCases/resolve/main-field-fallback/rspack.config.js
@@ -0,0 +1,19 @@
+const path = require("path");
+
+/**
+ * @type {import('webpack').Configuration | import('@rspack/cli').Configuration}
+ */
+module.exports = {
+  devtool: false,
+  entry: {
+    main: {
+      import: "./index.js",
+    },
+  },
+  resolve: {
+    mainFields: ['module', 'main'],
+    extensionAlias: {
+      '.js': ['.ts', '.js']
+    }
+  },
+};