导入路径中的 @ 是啥意思?

Posted

技术标签:

【中文标题】导入路径中的 @ 是啥意思?【英文标题】:What does the @ mean inside an import path?导入路径中的 @ 是什么意思? 【发布时间】:2017-08-02 15:54:30 【问题描述】:

我正在开始一个新的 vue.js 项目,所以我使用 vue-cli 工具搭建了一个新的 webpack 项目(即vue init webpack)。

当我浏览生成的文件时,我注意到src/router/index.js 文件中有以下导入:

import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello' // <- this one is what my qusestion is about

Vue.use(Router)

export default new Router(
    routes: [
        
            path: '/',
            name: 'Hello',
            component: Hello
        
    ]
)

我以前没有在路径中看到 at 符号 (@)。我怀疑它允许相对路径(也许?),但我想确定我理解它的真正作用。

我尝试在网上四处搜索,但找不到解释(可能是因为搜索“at 符号”或使用文字字符 @ 作为搜索条件没有帮助)。

@ 在这条路径中做了什么(链接到文档会很棒),这是 es6 的东西吗?一个 webpack 的东西?一个 vue-loader 的东西?

更新

感谢 Felix Kling 向我指出关于同一问题的另一个重复的 *** 问题/答案。

虽然对另一个 *** 帖子的评论并不是这个问题的确切答案(在我的情况下它不是 babel 插件),但它确实为我指明了正确的方向来找到它是什么。

在 vue-cli 为您创建的脚手架中,部分基本 webpack 配置为 .vue 文件设置了别名:

这很有意义,因为它为您提供了来自 src 文件的相对路径它消除了导入路径末尾的 .vue 的要求(您通常需要)。

感谢您的帮助!

【问题讨论】:

See my comment. @FelixKling 这不是完全重复的,因为它没有回答整个问题,这是 es6 的东西吗?一个 webpack 的东西?一个 vue-loader 的东西? 是的,我认为这个问题很相似,但不是重复的。不管我弄清楚它的来源并用解释更新了问题,因为我无法将其添加为答案。 @estus:答案很清楚它不是 ES6 的一部分,而是 webpack 配置的东西,你不觉得吗?这也正是这里的情况,只是配置的性质有点不同。 @FelixKling 这取决于。但是由于您链接的问题没有详细的答案来解释 Webpack 的情况,因此它可能值得一个答案。通常有 'Possible duplicate of ...' 评论足以指定问题之间的联系,其余的由 vox populi 完成。我经常看到这些问题在 SO 上被过度欺骗了。 【参考方案1】:

这是通过 Webpack resolve.alias 配置选项完成的,并不特定于 Vue。

In Vue Webpack template,Webpack 配置为将@/ 替换为src path:

  const path = require('path');

  ...
  resolve: 
    extensions: ['.js', '.vue', '.json'],
    alias: 
      ...
      '@': path.resolve('src'),
    
  ,
  ...

别名用作:

import '@/<path inside src folder>';

【讨论】:

javascript 不再是 JavaScript。 Babel/webpack 为我们提供了这种科学怪人语言,并且不知何故,新开发人员应该知道 ECMAScript 规范的结束位置和用户空间插件/转换的开始位置。真的很伤心,imo。 @naomik 是否将此类技巧引入设置取决于用户。这对 Vue 来说没什么大不了的,因为它依赖于它的自定义 .vue 文件格式。 我个人认为,如果你愿意,可以增加灵活性是一件好事。我认为它不像科学怪人,而更像是 voltron。您可以像狮子一样做事,也可以将不同的狮子组合在一起以拥有更大的机器人。是的,有时你会遇到这样的问题,但并不是找不到答案。真的,你可以对任何规模的项目采取 frankenstein 或 voltron 的观点,它只是“使用和理解依赖关系”。 @ChrisSchmitz 这取决于上下文和视角。这样做会限制项目使用 Webpack。如果项目打算在它们到达时使用原生 ES6 模块,或者它是 Node,CommonJS 可以用于模块,这可能不是一件好事。另一方面,较长的相对路径可能更难维护和重构。 当使用vue-cli v3+ 时,您应该使用~@ 来引用src 文件夹。例如:$font-path: '~@/assets/fonts/';【参考方案2】:

另外请记住,您也可以在 tsconfig 中创建变量:

"paths": 
  "@components": ["src/components"],
  "@scss": ["src/styles/scss"],
  "@img": ["src/assests/images"],
  "@": ["src"],

这可用于命名约定目的:

import  componentHeader  from '@components/header';

【讨论】:

但是这种别名将在源 JS 中保持空白,然后在运行时您需要有一个包装器进行调解以使别名工作。也许有一种方法可以通过 babel 让这个 TS 语法在构建时得到转换? Typescript 的tsc 不是,因此您需要module-aliastsconfig-paths 之类的东西。 添加此设置后,vs代码无法解析路径,点击导入的模块时无法进入文件。【参考方案3】:

我通过以下组合克服了

import HelloWorld from '@/components/HelloWorld'
=>
import HelloWorld from 'src/components/HelloWorld'

IDE 将停止警告 uri,但这会在编译时导致 uri 无效,在“build\webpack.base.conf.js”中

resolve: 
  extensions: ['.js', '.vue', '.json'],
  alias: 
    'src': resolve('src'),
  
,

宾果!

【讨论】:

【参考方案4】:

解析('src') 对我没有用 但 path.resolve('src') 作品

resolve: 
    alias: 
      'vue$': 'vue/dist/vue.esm.js',
      '@': path.resolve('src')
    ,
    extensions: ['*', '.js', '.vue', '.json']
  ,

【讨论】:

【参考方案5】:

也许尝试在 webpack 中添加。 mix.webpackConfig 引用 laravel mix

mix.webpackConfig(

    resolve: 
        alias: 
            '@imgSrc': path.resolve('resources/assets/img')
        
    
);

然后在vue中使用。

<img src="@imgSrc/logo.png" />

【讨论】:

【参考方案6】:

一定有什么改变了。这里给出的答案不再正确。第 9 章中的 This project 在其导入语句中使用了 @ 符号,但 webpack.config.js 文件没有路径解析语句:

let service = process.VUE_CLI_SERVICE

if (!service || process.env.VUE_CLI_API_MODE) 
  const Service = require('./lib/Service')
  service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())
  service.init(process.env.VUE_CLI_MODE || process.env.NODE_ENV)


module.exports = service.resolveWebpackConfig()

【讨论】:

以上是关于导入路径中的 @ 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

icpc(或我猜是gcc)的预处理输出中的包含路径/数字是啥意思?

Oracle的导入导出命令是啥?

path是啥意思

PHP中的ABSPATH是啥意思?

URL中的冒号“:”是啥意思?

URL 路径中的 id 是啥? [复制]