首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致异常的webpack val加载器

导致异常的webpack val加载器
EN

Stack Overflow用户
提问于 2016-02-12 05:08:59
回答 3查看 2.6K关注 0票数 0

我正在尝试在webpack编译时动态包含一个.js文件。

我不想使用上下文来加载环境变量,因为我不会在代码中使用这些神奇的变量。

我想要做的是使用val加载程序来执行一个模块。这里使用一个环境变量来决定要导入的模块。并导出该模块。

但是,这会导致其他加载器抛出错误。

下面是我的dir布局

代码语言:javascript
复制
--base
  --src
    app.js
    test.js
  webpack.config.js
  rawr.js

下面是我的webpack.config.js文件

代码语言:javascript
复制
var path = require('path');
var webpack = require('webpack');
// var process = require('process');

var env = require(process.env.NODE_ENV || './devConf.js');

module.exports = {
    // Specify logical root of the sourcecode
    plugins: [
        new webpack.DefinePlugin(env)
    ],
    context: path.join(__dirname, '/src'),
    entry: {
    app: ['bootstrap.js'],
  },

    // Specify where to put the results
    output: {
        path: path.join(__dirname, '/dist'),
        filename: 'build.js'
    },

    // Specify logical root of package imports so as to avoid relative path everywhere
    resolve: {
        root: path.join(__dirname, '/src'),
        // What files we want to be able to import
        extensions: ['', '.js', '.css', '.less'],
    },

    module: {
        preLoaders: [
            // Lint all js before compiling
            /*{
                test: /\.js$/,
                exclude: /node_modules/,
                loader: 'eslint-loader'
            }*/
        ],
        loaders: [
            {
                test: /\.js$/,
                query: {
                    presets: ['es2015']
                },
                exclude: /node_modules/,
                loader: 'babel'
            },
            {
                test: /\.tpl\.html$/,
                exclude: /node_modules/,
                loader: 'ngtemplate?relativeTo=/src/!html'
            },
      {
        test: /\.scss$/,
        loaders: ["style", "css", "sass"]
      },
      {
        test: /\.css$/,
        loaders: ["style", "css"]
      }
        ]
    },

    // Dev server settings
    devServer: {
        contentBase: path.join(__dirname, '/dist'),
        noInfo: false,
        hot: true
    },

    // ESLint config
    eslint: {
        configFile: path.join(__dirname, '.eslintrc')
    }
};

我的js文件如下所示

代码语言:javascript
复制
// app.js
let b = require('val!test.js');

// test.js
var process = require('process');
loadedModule = require(process.env.NODE_ENV) // NODE_ENV='./rawr.js'
export const myString = loadedModule

// rawr.js
module.exports.test = "hello world";

我得到的异常是:

代码语言:javascript
复制
ERROR in ./src/app/app.js
Module parse failed: /home/smaug/Projects/angular-template/node_modules/babel-loader/index.js?{"presets":["es2015"]}!/home/smaug/Projects/angular-template/src/app/app.js Line 1: Unexpected identifier
You may need an appropriate loader to handle this file type.
| 'use strict';
| 
| require('angular-animate');
 @ ./src/bootstrap.js 7:0-18

这和我想做的事无关。但是如果我删除了请求(‘val!...’)声明,它就消失了。

有什么想法吗?

更新:

如果将require语句改为

代码语言:javascript
复制
let b = require('val!./test.js');

我得到以下错误:

代码语言:javascript
复制
ERROR in ./~/val-loader!./src/app/test.js
Module build failed: Error: Final loader didn't return a Buffer or String
    at DependenciesBlock.onModuleBuild (/home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:299:42)
    at nextLoader (/home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
    at /home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:292:15
    at runSyncOrAsync (/home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:160:12)
    at nextLoader (/home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:290:3)
    at /home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:292:15
    at Object.context.callback (/home/smaug/Projects/angular-template/node_modules/webpack-core/lib/NormalModuleMixin.js:148:14)
    at Object.module.exports (/home/
EN

回答 3

Stack Overflow用户

发布于 2016-02-12 06:09:51

代码语言:javascript
复制
// app.js
let b = require('val!./test.js');
票数 1
EN

Stack Overflow用户

发布于 2016-12-05 16:46:22

这是一个非常令人困惑的错误消息。

检查以下故障..

  1. import语句指向确切的文件;
  2. 在import语句中出现文件名拼写错误;正在导入不存在的模块。
  3. 检查您是否安装了所有加载程序,如

css-loader node-sass解析-url-loader sass-loader\ style-loader url

4. 4.import语句为空

例如:

代码语言:javascript
复制
import * from '';

不返回任何内容的

  1. 服务和提供程序也可能导致此错误。
票数 0
EN

Stack Overflow用户

发布于 2017-01-07 01:39:49

test.js应该返回一个字符串,其中包含应该提供给需要它的模块的代码。因此,对于您的示例,test.js应该从以下内容开始

代码语言:javascript
复制
var process = require('process');
loadedModule = require(process.env.NODE_ENV) // NODE_ENV='./rawr.js'
export const myString = loadedModule

到这个

代码语言:javascript
复制
var process = require('process')
loadedModule = require('raw-loader!' + process.env.NODE_ENV)
export const myString = loadedModule

使用"raw-loader“,您将从rawr.js获得文本代码,而不是rawr.js导出的值。然后,"val-loader“将把rawr.js的代码提供给app.js中的require,它将加载该文本,就像它是您试图加载的文件的文本一样。

这可能是一个糟糕的解释,但请记住,当您使用val-loader时,您需要返回一个包含代码的字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35350059

复制
相关文章

相似问题

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