我使用webpack路径别名来加载ES6模块。
例如:如果我为utils
定义了别名,而不是像这样写:
import Foo from "../../../utils/foo"
,我可以这样写:
import Foo from "utils/foo"
问题是一旦我开始使用别名,WebStorm就无法追踪导入,我会得到警告并失去自动完成功能。
有没有一种方法可以指示WebStorm使用这种别名?
我使用webpack路径别名来加载ES6模块。
例如:如果我为utils
定义了别名,而不是像这样写:
import Foo from "../../../utils/foo"
,我可以这样写:
import Foo from "utils/foo"
问题是一旦我开始使用别名,WebStorm就无法追踪导入,我会得到警告并失去自动完成功能。
有没有一种方法可以指示WebStorm使用这种别名?
有的。
事实上,Webstorm不能自动解析和应用Webpack配置,但你可以通过同样的方式设置别名。
你只需要将“utils”(在您的示例中)的父文件夹标记为资源根目录(右键单击,标记目录为/资源根目录)。
我们刚刚使用了以下结构:
/src
/A
/B
/C
我们在Webpack中将A、B和C文件夹声明为别名。而在WebStorm中,我们将“src”标记为“资源根目录”。
现在我们可以直接导入:
import A/path/to/any/file.js
代替
import ../../../../../A/path/to/any/file.js
同时仍然可以使Webstorm正确解析和索引所有代码、链接到文件、自动完成等等...
您可以定义自定义路径,以便WebStorm/PhpStorm能够理解您的别名。但是请确保它们与您的别名相同。在根目录中创建一个文件,例如webStorm.config.js
(任何js
文件都可以)。然后在其中配置您的路径:
System.config({
"paths": {
"components/*": "./src/components/*",
"core/*": "./src/core/*",
...
}
});
WebStorm/PhpStorm将会把System
识别为自己的模块,并将这个文件视为配置文件。
"config": "./src/server/lib/config/index.js"
,但是那行不通。 - Matt记录一下:在PHPSTORM中,使用laravel mix时,我通过创建单独的webpack.config.js文件解决了这个问题,例如:
const path = require('path')
const webpack = require('webpack')
module.exports = {
...
resolve: {
extensions: ['.js', '.json', '.vue'],
alias: {
'~': path.resolve(__dirname, './resources/assets/js')
}
},
...
}
然后,在 webpack.mix.js 中导入它,如下所示:
const config = require('./webpack.config')
...
mix.webpackConfig(config)
请确保在PhpStorm的“设置” > “语言和框架” > “JavaScript” > “Webpack”配置中,正确指向webpack配置文件。
mix
符号,这是强烈的提示它实际上不会工作。缺少了一些关键重要的行,在其中某种方式需要/导入 "mix" 符号。请将这些添加到您的答案中。 - Szczepan Hołyszewski这个问题已经在评论中得到了回答,但为了避免人们深入评论并仅链接相关信息,这里是答案:
从WS2017.2开始,这将自动完成。相关信息在这里。
根据此信息,WebStorm将自动解析包含在项目根目录下的webpack.config
中的别名。如果您有自定义结构且您的webpack.config
不在根文件夹中,则转到设置|语言和框架|JavaScript | Webpack
并设置所需的配置选项。
注意:大多数设置都有一个base
配置,然后调用dev
或prod
版本。为了使其正常工作,您需要告诉WebStorm使用dev版本。
@
作为我的src
文件夹的别名,但即使在Webstorm中指向了我的配置文件,它仍无法正确解析我的导入。然而,一旦我将src
文件夹标记为资源根目录,它就按预期工作了。如果Webstorm能处理别名就更好了,但也没关系。 - dericcain'@': '../src'
。另外,你是在使用一个文件来配置webpack,还是多个文件?想知道有什么不同之处。谢谢! - dericcain'@': path.resolve(__dirname, '../src/components')
。我使用多个文件,包括 webpack.base.conf.js
以及其对应的 dev
和 prod
版本。它们又调用了一个名为 index.js
、dev.env.js
和 prod.env.js
的配置文件夹。我将 Webstorm 设置为查看 webpack.dev.conf.js
文件。 - webnoob.dev.conf
就解决了问题。指向.base.conf
是不起作用的。好主意! - dericcain在项目根目录下添加 jsconfig.js
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"~/*": ["./src/*"]
}
}
}
目前不行,我们在React项目中使用了路径别名。虽然导入名称更短,但我们失去了WebStorm静态检查和代码补全等很多功能。
后来我们决定将代码深度减少到仅有3级,公共部分只有一个级别。WebStorm的路径自动补全功能(ctrl + space)
甚至有助于减少输入工作量。而且生产环境构建不会使用较长的名称,因此在最终代码中几乎没有任何区别。
我建议重新考虑关于路径别名的决定。你会失去来自node_modules和你自己的代码模块的语义含义,并且反复引用别名文件以理解你的代码,这是一个更大的负担。
对于那些遇到问题的人:为了让Idea(Websorm)能够正确解析路径,必须首先使用“__dirname”作为第一个参数调用path.resolve()。
这将适用于Idea(Websorm):
alias: {
'@someAlias': pathLib.resolve(__dirname, 'path/to/directory')
}
以下内容不适用于Idea(Webstorm)(虽然它仍然是有效的webpack别名):
alias: {
'@someAlias': pathLib.resolve('path/to/directory')
}
@someAlias
? - Dave Johansen这里有很多关于Laravel Mix的讨论,为了帮助未来的读者,我将提供以下信息。我通过创建一个单独的(虚假的)webpack配置文件来解决这个问题,该文件仅由我的IDE(PHPStorm)使用。
1. 创建一个单独的alias.js
文件(例如/webpack/alias.js)
const path = require('path');
const assets = path.join(__dirname,'..','resources','assets');
module.exports = {
'@js' : path.resolve(assets, 'js'),
'@c' : path.resolve(assets, 'js', 'components'),
'@errors' : path.resolve(assets, 'js', 'errors'),
'@utils' : path.resolve(assets, 'js', 'utils'),
'@store' : path.resolve(assets, 'js', 'store'),
'@api' : path.resolve(assets, 'js', 'api'),
'@less' : path.resolve(assets, 'less')
}
2. 把alias.js
文件引入到webpack.mix.js
中
const mix = require('laravel-mix');
mix.alias(require('./webpack/alias'))
// ... The rest of your mix, e.g.
.js('app.js')
.vue()
.less('app.less');
3. 为你的IDE创建虚假的webpack配置文件(例如/webpack/ide.config.js)
在这里,导入laravel-mix webpack配置文件,以及你的别名和任何其他配置,帮助IDE找到需要的内容。同时,包括前缀为~的别名,用于将样式导入Vue组件。
/*
|--------------------------------------------------------------------------
| A fake config file for PhpStorm to enable aliases
|--------------------------------------------------------------------------
|
| File > Settings... > Languages & Frameworks > Javascript > Webpack
|
| Select "Manually" and set the configuration file to this
|
*/
const path = require('path');
const mixConfig = require('./../node_modules/laravel-mix/setup/webpack.config')();
module.exports = {
...mixConfig,
resolve: {
alias: {
...require('./alias'),
'~@less' : path.resolve('@less'), // <--
},
...mixConfig.resolve
}
}
4. 将你的IDE设置为使用webpack/ide.config.js
作为你的Webpack配置文件。
import { Component } from '@angular/core'
这样的导入也会被解析。如果想要更清晰地表明路径是别名,应该如何实现at
呢? - Hitmands