アプリがモジュールとして機能するための名前空間を用意し、この名前空間を使用してコンポーネントをインポートし、相対パスの使用を制限しようとしています。
ただし、ここではエイリアスのWebpackドキュメントに従っていますが、 http://webpack.github.io/docs/configuration.html#resolve-alias 動作させることができません。
これは私の解決オブジェクトがどのように見えるかです:
_resolve: {
root: path.resolve(__dirname),
alias: {
myApp: './src',
},
extensions: ['', '.js', '.json', '.jsx']
}
_
path.resolve(__dirname)
は_/Users/Alex/Workspace/MyAppName/ui/
_を解決します
その方法でファイルをファイル_/Users/Alex/Workspace/MyAppName/ui/src/components/Header/index.jsx
_にインポートします。
_import { myMethod } from 'myApp/utils/myUtils';
_
ビルド中に次のエラーが表示されます。
_ERROR in ./src/components/Header/index.jsx
Module not found: Error: Cannot resolve module 'myApp/utils/myUtils' in /Users/Alex/Workspace/MyAppName/ui/src/components/Header
@ ./src/components/Header/index.jsx 33:19-56
_
私もmodulesDirectories
を試してみましたが、どちらも機能しません。
何が悪いのか分かりますか?
エイリアスを絶対パスに解決すると、トリックが実行されます。
resolve: {
alias: {
myApp: path.resolve(__dirname, 'src'),
},
extensions: ['', '.js', '.jsx']
}
簡単な例でこれを確認してください webpack resolve alias Gist 。
相対パスの数を制限する別の解決策は、./src
フォルダーをエイリアスする代わりに root として追加することです。
resolve: {
root: [path.resolve('./src')],
extensions: ['', '.js', '.jsx']
}
そうすれば、./src
内のすべてのフォルダーを、モジュールが配置されているかのように要求できます。たとえば、次のディレクトリ構造があるとします。
.
├── node_modules
├── src
│ ├── components
│ └── utils
次のようにcomponents
およびutils
からインポートできます。
import Header from 'components/Header';
import { myMethod } from 'utils/myUtils';
./src
内の各フォルダーのエイリアスを持つようなもの。
これは多くの人にとって明白かもしれませんが、私と同じように、WindowsまたはMacからLinuxに移動したときに突然機能しない理由を理解するために多くの時間を費やしている場合は、パスの大文字と小文字を確認してください...
私とプロジェクトの他のすべての人はWindowsまたはMacを使用していますが、自宅ではデュアルブートUbuntuを使用しています。コードのクローンを作成してwebpackを実行すると、_Cannot resolve module...
_エラーが大量に発生しました。失敗したモジュールのパスが_@app/Shared/settings.js
_のようなもので、requireがrequire('@app/shared/settings')
。 Windowsは気にしないので、私がLinuxに取り掛かるまで、すべてがうまくいきました。結局のところ、問題はwebpackやnodeなどにあるのではないため、これが問題である可能性を示唆する人を見つけられなかったのはおそらくそのためです。
これが誰かの時間を節約することを願っています。それとも、私はばかげているだけかもしれません。
同じエラーが発生しました。 Finnalyが問題を見つけたのは、resolve
を2回書いたことです。そして、2番目のresolve
は前のものを上書きします。私のコードは次のとおりです:
modules.exports = {
resolve: {
extensions: ['.js', '.jsx'],
alias: {
Components: path.resolve(__dirname, 'src/components/'),
}
},
...
resolve: {
...
}
}
さらにヘルプが Webpack Doc にあります
ほとんどの場合、プロジェクトのフォルダ構造に依存します。 Webpackファイルがフォルダー内にある場合は、それを適切に処理するようにしてください
.
├── node_modules
├── src
│ ├── components
│ └── config/webpack.config.js
modules.exports = {
resolve: {
extensions: ['.js', '.jsx'],
alias: {
Components: path.resolve(__dirname, '../src/components/'),
}
},
...
resolve: {
...
}
}
また、フォルダに「ソース」という名前を付けて、パスに「src」を使用することもよくあります。
くそー!そのコピーペーストは私のデバッグ時間の多くを費やしました
これが上記の理由のためにそのような問題に直面している誰かを助けることを願っています。
私は次の構文なしで使用します:
resolve: {
alias: {
Data: __dirname + '/src/data'
},
extensions: ['.js', '.jsx', '.json']
}
import points from 'Data/points.json';