Çözümlemek için webpack ile yollar gerekir


164

Hala webpack ile modül yollarını çözmek için kafam karıştı. Şimdi yazıyorum:

myfile = require('../../mydir/myfile.js') 

ama yazmak istiyorum

myfile = require('mydir/myfile.js') 

Çözme.alias'ın{ xyz: "/some/dir" } takma ad olarak kullandığım benzer bir örneği gördüğüm için yardımcı olabileceğini düşünüyordum require("xyz/file.js").

Ben benim takma set Ama eğer { mydir: '/absolute/path/mydir' }, require('mydir/myfile.js') iş olmaz.

Aptal hissediyorum çünkü dokümanı defalarca okudum ve bir şeyleri kaçırdığımı hissediyorum. ../../Vb ile gerekli tüm akrabaları yazmaktan kaçınmanın doğru yolu nedir ?


resolve.aliastam olarak önerdiğiniz şekilde çalışır. resolveYapılandırmanızdaki başka bir şey yüzünden başarısız olup olmadığını merak ediyorum . Ben kullanıyorum alias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )ve require( 'mydir/myfile.js' )gayet iyi çalışıyor.
sethro

Yanıtlar:


142

Web paketi> 2.0

Wtk'nin cevabına bakınız .

Webpack 1.0

Bunu yapmanın daha basit bir yolu resol.root kullanmak olacaktır.

http://webpack.github.io/docs/configuration.html#resolve-root

resolve.root

Modüllerinizi içeren dizin (mutlak yol). Ayrıca bir dizi dizin de olabilir. Bu ayar, arama yoluna tek tek dizinler eklemek için kullanılmalıdır.

Senin durumunda:

webpack yapılandırması

var path = require('path');

// ...

  resolve: {
    root: path.resolve('./mydir'),
    extensions: ['', '.js']
  }

tüketen modül

require('myfile')

veya

require('myfile.js')

ayrıca bkz: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories


1
Teşekkürler, denedim root, modulesDirectoriesve ikisinin bir karışımı, ama işe yaramadı. Alt modüllerin (örn. require("mydir/file")) Kabul edilmediği anlaşılıyor .
gpbl

Olmalıdır - webpack yapılandırmanızı görebilir miyiz?
Jeff Ling

1
Bunu doğru anlıyorsam, bu yapılandırmayı kullanmak dosya adlarının benzersiz olmasını gerektirir mi?
Jonny

1
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'.
Tomáš Zato - Monica'yı yeniden başlatın

1
"webpack 2, yolları çözmenin bir yolu olarak modüller hariç her şeyi kaldırdı. Bu,
root'un

72

İleride başvurmak üzere webpack 2, modulesyolları çözmenin bir yolu olarak her şeyi kaldırdı . Bu araçlar rootolacak değil çalışır.

https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options

Örnek yapılandırma şununla başlar:

{
  modules: [path.resolve(__dirname, "app"), "node_modules"]
  // (was split into `root`, `modulesDirectories` and `fallback` in the old options)

4
Teşekkürler, bu gerçekten yararlı. modulesDirectorieswebpack-dev-server tarafından, webpack 2 ile bile kullanılıyor, bu da bunu çok kafa karıştırıcı hale getiriyor.
Evan

63

resolve.alias tam olarak tarif ettiğiniz şekilde çalışmalıdır, bu yüzden orijinal sorunun çalışmadığı yönündeki öneriden kaynaklanabilecek karışıklıkları azaltmaya yardımcı olmak için bunu bir cevap olarak sağlıyorum.

aşağıdaki gibi bir çözüm yapılandırması size istenen sonuçları verecektir:

// used to resolve absolute path to project's root directory (where web pack.config.js should be located)
var path = require( 'path' );
...
{
  ...
  resolve: {
    // add alias for application code directory
    alias:{
      mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
    },
    extensions: [ '', '.js' ]
  }
}

require( 'mydir/myfile.js' )beklendiği gibi çalışacaktır. Değilse, başka bir sorun olmalı.

Arama yoluna eklemek istediğiniz birden fazla modülünüz varsa resolve.root, mantıklıdır, ancak uygulama kodunuzdaki bileşenlere göreli yollar olmadan başvurabilmek istiyorsanız alias, en basit ve açıktır.

Bunun önemli bir avantajı, kodunuza netlik aliaskatabilen size ad alanı koyma fırsatı vermesidir require; tıpkı diğer requiremodüllerden hangi modüllere başvurulduğunu görmek kolay olduğu gibi, dahili modüllere ihtiyaç duyduğunuzu açıkça ortaya koyan aliasaçıklayıcı requires yazmanıza olanak tanır , örn require( 'my-project/component' ). resolve.rootsadece daha fazla ad alanı oluşturma fırsatı vermeden sizi istediğiniz dizine yerleştirir.


46
Ben tilde takma adı:alias: {'~': path.resolve(__dirname)},
Daniel Buckmaster

herhangi bir ipucu nasıl dosya uzantısı olmadan alt dizin ithalat desteklemek için bu çözümü ayarlamak için? @sethro
Dima Feldman

@DimaFeldman, yani argüman ( require('mydir/myfile')) için uzantı yok mu? Aslında işe yarayacak. İçinde birden fazla girişiniz olabilir alias; Benim dan ithalat için kullanabilirsiniz srcbenim aktarılabilecek JavaScript modülleri için dizin ve başka stylescss için dizine. Sorunuzu tamamen yanlış anladıysam bana bildirin.
sethro

@sethro haklısın, sorumu yeniden ifade edeyim - ne demek istediğim: Component1 diyelim bir dizinim var ve bu dizin içinde Component1.js adlı bir dosyam var. takma ad kullanmadan önce, dosyayı arayarak içe aktarabilirim import './path/to/Component1';- sadece yoldaki iç dosya adı ve uzantısı olmadan. webpack, İç dosyanın dizinin adına sahip olduğunu saptamayı başardı ve sadece içe aktardı. şimdi yapmak istediğim şey şu şekilde: import 'shared\Component1';'paylaşılan' takma ad olduğunda. ancak İç dosya adını belirtmeden çalışmaz. Teşekkürler!
Dima Feldman

1
@DimaFeldman Üzgünüm, tanımladığınız davranışa aşina değilim; bu yüzden sadece bilinen bir özelliği bilmiyorsam beni affetmeniz gerekecek (bunun için belge bulamıyorum). Yapılandırmanızda sadece konumunu belirterek (ancak dosya adını değil) bir modülü içe aktarma olanağı sağlayan bazı yükleyiciniz var mı acaba? Maalesef yardım etmiyorum ... Yapılandırma dosyanız dahil yeni bir soru sormak en iyisi olabilir.
sethro

13

Başka kimse bu sorunla karşılaşırsa, ben böyle çalışmasını başardı:

var path = require('path');
// ...
resolve: {
  root: [path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules')],
  extensions: ['', '.js']
};

benim dizin yapısı:

.
├── dist
├── node_modules
├── package.json
├── README.md
├── src
   ├── components
   ├── index.html
   ├── main.js
   └── styles
├── webpack.config.js

Sonra srcdizinde herhangi bir yerden arayabilirim:

import MyComponent from 'components/MyComponent';

2
Node_modules'ü path.resolve kullanarak çözümlemek iyi değildir. Bu, alt bağımlılıklarda sorunlara neden olabilir. 'node_modules'Bunun yerine dizeyi kullanın. [ path.resolve(__dirname, 'src'), 'node_modules' ],
spencer.sm

@ spencer.sm Ya sadece modüllerin mevcut projeden çözülmesini istersem? Birbirinden ithal eden birkaç projem var. Eğer projectA fileA'yı projectB'den ve fileA alırsa, SADECE çözümlenmesini lodashistiyorum . Bunun için yararlı olan budur. Ancak senin dediğin gibi alt bağımlılıklarla ilgili sorunlar yaşıyorum. Webpack'e, node_modules çözünürlüğünü sınırlamanın yanı sıra alt bağımlılıklar bulmasını söylemenin bir yolu var mı ? lodashprojectA/node_modulesresolve.modules: [path.resolve(__dirname, 'node_modules')]projectA/node_modules
Eric Guan

@ spencer.sm teşekkürler! Çok mücadele ettikten sonra, sonunda çözümünüz bağımlılık sorunlarımı çözdü: D
Saad Abdullah

5

En büyük baş ağrım isim boşluğu olmadan çalışıyordu. Bunun gibi bir şey:

./src/app.js
./src/ui/menu.js
./node_modules/lodash/

Bunu yapmak için ortamımı ayarlamadan önce:

require('app.js')
require('ui/menu')
require('lodash')

srcÖnemli bağlam bilgilerini gizleyen, örtük bir yoldan kaçınmak için çok daha uygun buldum .

Amacım böyle bir şey istemektir:

require('src/app.js')
require('src/ui/menu')
require('test/helpers/auth')
require('lodash')

Gördüğünüz gibi, tüm uygulama kodum zorunlu bir yol ad alanı içinde yaşıyor. Bu hangi çağrı gerektiren bir kütüphane, uygulama kodu veya bir test dosyası gerektirir oldukça açıktır.

Bunun node_modulesiçin uygulamanızı kaynak klasörünüzdesrc/my_app

Bu benim webpack ile varsayılan

resolve: {
  extensions: ['', '.jsx', '.js', '.json'],
  root: path.resolve(__dirname),
  modulesDirectories: ['node_modules']
}

Ortamın NODE_PATHmevcut proje dosyanıza göre ayarlanması daha da iyi olur . Bu daha evrensel bir çözümdür ve webpack olmadan başka araçlar kullanmak istiyorsanız yardımcı olacaktır: test, linting ...



3

Bunu Webpack 2 kullanarak çözdüm:

   resolve: {
      extensions: ['', '.js'],
        modules: [__dirname , 'node_modules']
    }


1

Bu iş parçacığı eski ama kimse requir.context hakkında yayınlanmıştır beri ben bahsedeceğim:

Klasörü şu şekilde görünecek şekilde ayarlamak için requir.context kullanabilirsiniz:

var req = require.context('../../mydir/', true)
// true here is for use subdirectories, you can also specify regex as third param

return req('./myfile.js')

0

Neden kimsenin myDir'in üst dizinini modüllere dahil etmeyi önerdiğini anlamadım.Web paketindeki dizinler, bu kolayca hile yapmalıdır:

resolve: {
    modulesDirectories: [
      'parentDir',
      'node_modules',
    ],
    extensions: ['', '.js', '.jsx']
  },

0

Sadece babel-plugin-module-resolver kullanın :

$ npm i babel-plugin-module-resolver --save-dev

Ardından .babelrc, zaten bir dosyanız yoksa kök altında bir dosya oluşturun :

{
    "plugins": [
        [
            "module-resolver",
            {
                "root": ["./"]
            }
        ]
    ]
}

Ve kök altındaki her şey mutlak ithalat olarak ele alınacaktır:

import { Layout } from 'components'

VSCode / Eslint desteği için buraya bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.