diff --git a/packages/playground/resolve/__tests__/resolve.spec.ts b/packages/playground/resolve/__tests__/resolve.spec.ts
index b64da138033fc0..c8c85d8df9b806 100644
--- a/packages/playground/resolve/__tests__/resolve.spec.ts
+++ b/packages/playground/resolve/__tests__/resolve.spec.ts
@@ -58,6 +58,12 @@ test('dont add extension to directory name (./dir-with-ext.js/index.js)', async
expect(await page.textContent('.dir-with-ext')).toMatch('[success]')
})
+test('do not resolve to the `module` field if the importer is a `require` call', async () => {
+ expect(await page.textContent('.require-pkg-with-module-field')).toMatch(
+ '[success]'
+ )
+})
+
test('a ts module can import another ts module using its corresponding js file name', async () => {
expect(await page.textContent('.ts-extension')).toMatch('[success]')
})
diff --git a/packages/playground/resolve/index.html b/packages/playground/resolve/index.html
index c0569345d86837..2c4ed7b9aa760c 100644
--- a/packages/playground/resolve/index.html
+++ b/packages/playground/resolve/index.html
@@ -58,6 +58,9 @@
Resolve file name containing dot
Browser Field
fail
+Don't resolve to the `module` field if the importer is a `require` call
+fail
+
CSS Entry
@@ -181,6 +184,9 @@ resolve package that contains # in path
text('.browser', main)
}
+ import { msg as requireButWithModuleFieldMsg } from 'require-pkg-with-module-field'
+ text('.require-pkg-with-module-field', requireButWithModuleFieldMsg)
+
import { msg as customExtMsg } from './custom-ext'
text('.custom-ext', customExtMsg)
diff --git a/packages/playground/resolve/package.json b/packages/playground/resolve/package.json
index 5e0f53b4c8468a..dda4476bc6ae82 100644
--- a/packages/playground/resolve/package.json
+++ b/packages/playground/resolve/package.json
@@ -12,6 +12,7 @@
"@babel/runtime": "^7.16.0",
"es5-ext": "0.10.53",
"normalize.css": "^8.0.1",
+ "require-pkg-with-module-field": "link:./require-pkg-with-module-field",
"resolve-browser-field": "link:./browser-field",
"resolve-custom-condition": "link:./custom-condition",
"resolve-custom-main-field": "link:./custom-main-field",
diff --git a/packages/playground/resolve/require-pkg-with-module-field/dep.cjs b/packages/playground/resolve/require-pkg-with-module-field/dep.cjs
new file mode 100644
index 00000000000000..3fb20b76d48b79
--- /dev/null
+++ b/packages/playground/resolve/require-pkg-with-module-field/dep.cjs
@@ -0,0 +1,5 @@
+const BigNumber = require('bignumber.js')
+
+const x = new BigNumber('1111222233334444555566')
+
+module.exports = x.toString()
diff --git a/packages/playground/resolve/require-pkg-with-module-field/index.cjs b/packages/playground/resolve/require-pkg-with-module-field/index.cjs
new file mode 100644
index 00000000000000..da215f306d1ac1
--- /dev/null
+++ b/packages/playground/resolve/require-pkg-with-module-field/index.cjs
@@ -0,0 +1,8 @@
+const dep = require('./dep.cjs')
+
+const msg =
+ dep === '1.111222233334444555566e+21'
+ ? '[success] require-pkg-with-module-field'
+ : '[failed] require-pkg-with-module-field'
+
+exports.msg = msg
diff --git a/packages/playground/resolve/require-pkg-with-module-field/package.json b/packages/playground/resolve/require-pkg-with-module-field/package.json
new file mode 100644
index 00000000000000..e409343a7567d5
--- /dev/null
+++ b/packages/playground/resolve/require-pkg-with-module-field/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "require-pkg-with-module-field",
+ "private": true,
+ "version": "1.0.0",
+ "main": "./index.cjs",
+ "dependencies": {
+ "bignumber.js": "9.0.2"
+ }
+}
diff --git a/packages/playground/resolve/vite.config.js b/packages/playground/resolve/vite.config.js
index be1b75e431383a..0550d1ecf6f044 100644
--- a/packages/playground/resolve/vite.config.js
+++ b/packages/playground/resolve/vite.config.js
@@ -40,5 +40,8 @@ module.exports = {
}
}
}
- ]
+ ],
+ optimizeDeps: {
+ include: ['require-pkg-with-module-field']
+ }
}
diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts
index 8f6a48a28da463..686c08b12c3248 100644
--- a/packages/vite/src/node/plugins/resolve.ts
+++ b/packages/vite/src/node/plugins/resolve.ts
@@ -738,7 +738,11 @@ export function resolvePackageEntry(
: isObject(data.browser) && data.browser['.']
if (browserEntry) {
// check if the package also has a "module" field.
- if (typeof data.module === 'string' && data.module !== browserEntry) {
+ if (
+ !options.isRequire &&
+ typeof data.module === 'string' &&
+ data.module !== browserEntry
+ ) {
// if both are present, we may have a problem: some package points both
// to ESM, with "module" targeting Node.js, while some packages points
// "module" to browser ESM and "browser" to UMD.
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4451cc9c87e636..22de761586a2f2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -456,6 +456,7 @@ importers:
'@babel/runtime': ^7.16.0
es5-ext: 0.10.53
normalize.css: ^8.0.1
+ require-pkg-with-module-field: link:./require-pkg-with-module-field
resolve-browser-field: link:./browser-field
resolve-custom-condition: link:./custom-condition
resolve-custom-main-field: link:./custom-main-field
@@ -466,6 +467,7 @@ importers:
'@babel/runtime': 7.16.5
es5-ext: 0.10.53
normalize.css: 8.0.1
+ require-pkg-with-module-field: link:require-pkg-with-module-field
resolve-browser-field: link:browser-field
resolve-custom-condition: link:custom-condition
resolve-custom-main-field: link:custom-main-field
@@ -497,6 +499,12 @@ importers:
packages/playground/resolve/inline-package:
specifiers: {}
+ packages/playground/resolve/require-pkg-with-module-field:
+ specifiers:
+ bignumber.js: 9.0.2
+ dependencies:
+ bignumber.js: 9.0.2
+
packages/playground/ssr-deps:
specifiers:
bcrypt: ^5.0.1
@@ -3365,6 +3373,10 @@ packages:
- supports-color
dev: false
+ /bignumber.js/9.0.2:
+ resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==}
+ dev: false
+
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}