🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more →
Socket
Book a DemoInstallSign in
Socket

vite-plugin-dynamic-import

Package Overview
Dependencies
Maintainers
2
Versions
52
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vite-plugin-dynamic-import

Enhance Vite builtin dynamic import

1.6.0
latest
Source
npm
Version published
Weekly downloads
295K
-11.97%
Maintainers
2
Weekly downloads
 
Created
Source

vite-plugin-dynamic-import

Enhance Vite builtin dynamic import

NPM version NPM Downloads awesome-vite

English | įŽ€äŊ“中文

✅ Alias
✅ Bare module(node_modules)
✅ Compatible @rollup/plugin-dynamic-import-vars limitations
✅ Webpack-like behavior

Install

npm i vite-plugin-dynamic-import -D

Usage

import dynamicImport from 'vite-plugin-dynamic-import'

export default {
  plugins: [
    dynamicImport(/* options */)
  ]
}

cases 👉 vite-plugin-dynamic-import/test

node_modules

dynamicImport({
  filter(id) {
    // `node_modules` is exclude by default, so we need to include it explicitly
    // https://github.com/vite-plugin/vite-plugin-dynamic-import/blob/v1.3.0/src/index.ts#L133-L135
    if (id.includes('/node_modules/foo')) {
      return true
    }
  }
})

API

dynamicImport([options])

export interface Options {
  filter?: (id: string) => boolean | void
  /**
   * ```
   * 1. `true` - Match all possibilities as much as possible, more like `webpack`
   * see https://webpack.js.org/guides/dependency-management/#require-with-expression
   * 
   * 2. `false` - It behaves more like `@rollup/plugin-dynamic-import-vars`
   * see https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#how-it-works
   * ```
   * 
   * @defaultValue true
   */
  loose?: boolean
  /**
   * If you want to exclude some files  
   * e.g `type.d.ts`, `interface.ts`
   */
  onFiles?: (files: string[], id: string) => typeof files | void
  /**
   * Custom importee
   * 
   * e.g. - append `\/*@vite-ignore*\/` in front of importee to bypass to Vite
   */
  onResolve?: (rawImportee: string, id: string) => typeof rawImportee | void
}

How and why?

We assume that the project structure is as follows

├─â”Ŧ src
│ ├─â”Ŧ views
│ │ ├─â”Ŧ foo
│ │ │ └── index.js
│ │ └── bar.js
│ └── router.js
└── vite.config.js
// vite.config.js
export default {
  resolve: {
    alias: {
      // "@" -> "/User/project-root/src/views"
      '@': path.join(__dirname, 'src/views'),
    },
  },
}

Dynamic import is not well supported in Vite, such as

  • Alias are not supported
// router.js
❌ import(`@/views/${variable}.js`)
  • Must be relative
// router.js
❌ import(`/User/project-root/src/views/${variable}.js`)
  • Must have extension
// router.js
❌ import(`./views/${variable}`)

We try to fix these problems

For the alias in import(), we can calculate the relative path according to importer

// router.js
✅ import(`./views/${variable}.js`)

If the import path has no suffix, we use glob to find the file according to UserConfig.resolve.extensions and supplement the suffix of the import path.
So we need to list all the possibilities

./views/${variable} -> ./views/*

  • generate runtime code
- // import(`./views/${variable}`)
+ __variableDynamicImportRuntime(`./views/${variable}`)

+ function __variableDynamicImportRuntime(path) {
+   switch (path) {
+     case 'foo':
+     case 'foo/index':
+     case 'foo/index.js':
+       return import('./views/foo/index.js');
+ 
+     case 'bar':
+     case 'bar.js':
+       return import('./views/bar.js');
+ }

Keywords

vite

FAQs

Package last updated on 16 Sep 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts