首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webpack无法解决相关路径导入表示静态

Webpack无法解决相关路径导入表示静态
EN

Stack Overflow用户
提问于 2020-12-14 19:07:49
回答 1查看 2.1K关注 0票数 1

我正在开发一个outlook,我有一个正在运行的快递服务器。我设置webpack是因为我需要将js转换到es5以使它在Outlook中工作。以下是简化的项目结构。

代码语言:javascript
复制
/public
  /javascripts
    ssoAuth.js
/addin
  /commmands
    commands.js
    commands.html
/server
  /bin
  /helpers
  app.js

公用文件夹设置为“我的快速服务器”中的静态文件夹。

代码语言:javascript
复制
app.use(express.static(path.join(__dirname, '../public'),

我的问题是在commands.js中,我用es6模块导入ssoAuth.js和相对路径:

代码语言:javascript
复制
import getGraphAccessToken from "/javascripts/ssoAuthES6.js";

当我运行节点./server/app.js并加载我的outlook外接程序时,它工作得很好,但是当我想使用Webpack绑定时,导入不起作用,我得到:

代码语言:javascript
复制
ERROR in ./addin/commands/commands.js
Module not found: Error: Can't resolve '/javascripts/ssoAuth.js'

我不知道如何配置webpack以允许从公用文件夹导入。

下面是我的webpack配置文件:

webpack.config.js:

代码语言:javascript
复制
const config = {
devtool: "source-map",
entry: {
  polyfill: "@babel/polyfill",
  commands: "./addin/commands/commands.js"
},
resolve: {
  extensions: [".ts", ".tsx", ".html", ".js"]
},
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: {
        loader: "babel-loader", 
        options: {
          presets: ["@babel/preset-env"]
        }
      }
    },
    {
      test: /\.html$/,
      exclude: /node_modules/,
      use: "html-loader"
    },
    {
      test: /\.(png|jpg|jpeg|gif)$/,
      use: "file-loader"
    }
  ]
},
plugins: [
  new CleanWebpackPlugin(),
  new HtmlWebpackPlugin({
    filename: "commands.html",
    template: "./addin/commands/commands.html",
    chunks: ["polyfill", "commands"]
  })
]};

webpack.server.config.js:

代码语言:javascript
复制
return ({
entry: {
  server: './server/bin/www',
},
output: {
  path: path.join(__dirname, 'dist'),
  publicPath: '/',
  filename: '[name].js'
},
target: 'node',
node: {
  __dirname: false,
  __filename: false,
},
externals: [nodeExternals()], 
module: {
  rules: [
    {
      // Transpiles ES6-8 into ES5
      test: /\.js$/,
      exclude: /node_modules/,
      use: {
        loader: "babel-loader"
      }
    }
  ]
},
plugins: [
  new CopyWebpackPlugin([
    {
      to: "./public",
      from: "./public"
    }
  ])
]})

你能帮我弄清楚吗?是否有一个更好的文件夹结构,我应该使用它来使它工作?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-16 19:39:57

你用的是绝对路径

代码语言:javascript
复制
import getGraphAccessToken from "/javascripts/ssoAuthES6.js";
//                               ^ this will look in your topmost directory on your OS

来自commands.js的相对路径是:

代码语言:javascript
复制
import getGraphAccessToken from "../../javascripts/ssoAuthES6.js";

或者,可以将Webpack设置为从根目录中查找模块,方法是将以下内容添加到webpack配置中:

代码语言:javascript
复制
{
// ...
    resolve: {
      modules: [path.resolve(__dirname, "src"), "node_modules"],
    },
// ...
}

然后您可以从项目的根目录中从任何地方导入,如下所示:

代码语言:javascript
复制
import getGraphAccessToken from "javascripts/ssoAuthES6.js";

其他几点:

  • 由于您正在设置extensions: [".ts", ".tsx", ".html", ".js"],所以不需要为这些导入提供文件扩展名
  • 您在webpack配置中指定了.ts.tsx,但您使用的是.js文件。考虑删除类型记录扩展
  • 如果使用的是类型记录,则需要更新tsconfig.json中的导入路径。
  • 您可以在Webpack和类型记录中考虑导入路径别名,以更明确地说明您的导入来自项目根。这里的说明
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65295007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档