Todavía estoy confundido sobre cómo resolver las rutas del módulo con webpack. Ahora escribo:
myfile = require('../../mydir/myfile.js')
pero me gustaria escribir
myfile = require('mydir/myfile.js')
Estaba pensando que resolve.alias puede ayudar ya que veo un ejemplo similar usando{ xyz: "/some/dir" } como alias, entonces puedo require("xyz/file.js").
Pero si configuro mi alias a { mydir: '/absolute/path/mydir' } , require('mydir/myfile.js') no funcionará.
Me siento tonto porque he leído el documento muchas veces y siento que me falta algo. ¿Cuál es la forma correcta de evitar escribir todo lo que el pariente requiere con ../../etc.?
javascript
webpack
gpbl
fuente
fuente

resolve.aliasfunciona exactamente de la manera que sugirió. Me pregunto si estaba fallando debido a algo más en suresolveconfiguración. Yo usoalias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )yrequire( 'mydir/myfile.js' )funciona bien.Respuestas:
Paquete web> 2.0
Ver la respuesta de wtk .
Webpack 1.0
Una forma más directa de hacerlo sería utilizar resolve.root.
http://webpack.github.io/docs/configuration.html#resolve-root
En tu caso:
configuración del paquete web
módulo de consumo
o
ver también: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
fuente
root,modulesDirectoriesy una combinación de ambos, pero no funcionó. Parece querequire("mydir/file")no se aceptan submódulos (p . Ej. ).WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema. - configuration.resolve has an unknown property 'root'.Para referencia futura, webpack 2 eliminó todo, pero
modulescomo una forma de resolver rutas. Esto significarootque no funcionará.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
La configuración de ejemplo comienza con:
fuente
modulesDirectorieswebpack-dev-server todavía lo utiliza, incluso con webpack 2, lo que hace que esto sea muy confuso.resolve.aliasdebería funcionar exactamente de la manera que usted describió, por lo que proporciono esto como una respuesta para ayudar a mitigar cualquier confusión que pueda resultar de la sugerencia en la pregunta original de que no funciona.Una configuración de resolución como la siguiente le dará los resultados deseados:
require( 'mydir/myfile.js' )Funcionará como se esperaba. Si no es así, debe haber algún otro problema.Si tiene varios módulos que desea agregar a la ruta de búsqueda,
resolve.roottiene sentido, pero si solo desea poder hacer referencia a componentes dentro del código de su aplicación sin rutas relativas,aliasparece ser el más directo y explícito.Una ventaja importante
aliases que le brinda la oportunidad de asignar un espacio de nombre a su correorequireelectrónico, lo que puede agregar claridad a su código; al igual que es fácil ver desde otrorequires a qué módulo se hace referencia, lealiaspermite escribir descriptivosrequireque hacen obvio que necesita módulos internos, por ejemplorequire( 'my-project/component' ).resolve.rootsimplemente lo coloca en el directorio deseado sin darle la oportunidad de espaciarlo más.fuente
alias: {'~': path.resolve(__dirname)},require('mydir/myfile'))? Eso debería funcionar realmente. Puede tener múltiples entradas enalias; Lo uso para importar desde misrcdirectorio para módulos JavaScript y otro para importar desde mistylesdirectorio para css. Avísame si he entendido mal tu pregunta.import './path/to/Component1';, simplemente sin el nombre de archivo interno y la extensión en la ruta. webpack de alguna manera logró detectar que el archivo interno tiene el nombre del directorio, y simplemente lo importó. ahora lo que quiero hacer es importarlo así:import 'shared\Component1';cuando 'compartido' es el alias. pero no funciona sin especificar el nombre del archivo interno. ¡Gracias!En caso de que alguien más se encuentre con este problema, pude hacer que funcione así:
donde mi estructura de directorios es:
Luego, desde cualquier lugar del
srcdirectorio, puedo llamar:fuente
'node_modules'lugar.[ path.resolve(__dirname, 'src'), 'node_modules' ],lodash, quierolodashque se resuelva SOLO desdeprojectA/node_modules. Para esto esresolve.modules: [path.resolve(__dirname, 'node_modules')]útil. Sin embargo, me encuentro con problemas con subdependencias como dijiste. ¿Hay alguna manera de decirle a webpack que también encuentre subdependencias además de restringir la resolución de node_modulesprojectA/node_modules?Mi mayor dolor de cabeza era trabajar sin una ruta de espacio de nombres. Algo como esto:
Antes solía configurar mi entorno para hacer esto:
Encontré mucho más conveniente evitar una
srcruta implícita , que oculta información de contexto importante.Mi objetivo es exigir así:
Como puede ver, todo el código de mi aplicación se encuentra dentro de un espacio de nombre de ruta obligatorio. Esto deja bastante claro qué llamada requerida requiere una biblioteca, un código de aplicación o un archivo de prueba.
Para esto, me aseguro de que mis rutas de resolución sean justas
node_modulesy la carpeta de la aplicación actual, a menos que el espacio de nombres de su aplicación dentro de su carpeta de origen comosrc/my_appEste es mi valor predeterminado con webpack
Sería aún mejor si configura el entorno var
NODE_PATHa su archivo de proyecto actual. Esta es una solución más universal y ayudará si desea utilizar otras herramientas sin paquete web: pruebas, linting ...fuente
Lo resolví con Webpack 2 así:
Puede agregar más directorios a la matriz ...
fuente
Lo resolví usando Webpack 2:
fuente
Si está utilizando create-react-app , simplemente puede agregar un
.envarchivo que contengaFuente: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
fuente
Este hilo es antiguo pero como nadie publicó sobre require.context lo voy a mencionar:
Puede usar require.context para configurar la carpeta para que se vea así:
fuente
No entendí por qué alguien sugirió incluir el directorio principal de myDir en modulesDirectories en webpack, eso debería hacer el truco fácilmente:
fuente
Simplemente use babel-plugin-module-resolver :
Luego crea un
.babelrcarchivo bajo root si aún no tienes uno:Y todo bajo root será tratado como una importación absoluta:
Para obtener soporte de VSCode / Eslint, consulte aquí .
fuente