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.alias
funciona exactamente de la manera que sugirió. Me pregunto si estaba fallando debido a algo más en suresolve
configuració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
,modulesDirectories
y 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
modules
como una forma de resolver rutas. Esto significaroot
que no funcionará.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
La configuración de ejemplo comienza con:
fuente
modulesDirectories
webpack-dev-server todavía lo utiliza, incluso con webpack 2, lo que hace que esto sea muy confuso.resolve.alias
deberí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.root
tiene sentido, pero si solo desea poder hacer referencia a componentes dentro del código de su aplicación sin rutas relativas,alias
parece ser el más directo y explícito.Una ventaja importante
alias
es que le brinda la oportunidad de asignar un espacio de nombre a su correorequire
electrónico, lo que puede agregar claridad a su código; al igual que es fácil ver desde otrorequire
s a qué módulo se hace referencia, lealias
permite escribir descriptivosrequire
que hacen obvio que necesita módulos internos, por ejemplorequire( 'my-project/component' )
.resolve.root
simplemente 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 misrc
directorio para módulos JavaScript y otro para importar desde mistyles
directorio 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
src
directorio, puedo llamar:fuente
'node_modules'
lugar.[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, quierolodash
que 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
src
ruta 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_modules
y 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_app
Este es mi valor predeterminado con webpack
Sería aún mejor si configura el entorno var
NODE_PATH
a 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
.env
archivo 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
.babelrc
archivo 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