在 LESS 中启用内联 javascript

Posted

技术标签:

【中文标题】在 LESS 中启用内联 javascript【英文标题】:Enable inline javascript in LESS 【发布时间】:2018-03-25 12:59:32 【问题描述】:

我想在我的 less 文件中使用内联 js,但我收到以下消息:

内联 javascript 未启用。是否在您的选项中设置?

我该如何启用它?

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,我使用 webpack 和 less loader,我需要在 less loader 配置中添加 javascript 选项:


        test: /\.less$/,
        use: [
            loader: "style-loader"
        , 
            loader: "css-loader"
        , 
            loader: "less-loader",
            options: 
                javascriptEnabled: true
            
        ]

在less编译器的源码中找到:https://github.com/less/less.js/blob/3.x/bin/lessc

他们以这种方式解析 js less 选项:

        case 'js':
            options.javascriptEnabled = true;
            break;
        case 'no-js':
            console.error('The "--no-js" argument is deprecated, as inline JavaScript ' + 
                'is disabled by default. Use "--js" to enable inline JavaScript (not recommended).');
            break;

因此,您可能应该在静态编译(命令行)中使用“--js”或在动态编译(如 webpack 加载器)中使用“javascriptEnabled: true”来启用 javascript。

【讨论】:

出于安全原因,此功能已被弃用。请参阅下面的其他答案以获取更多信息。 确切地说:应该避免使用 inline-javascript,如果您无法轻易摆脱的第 3 方包仍然这样做,那么所提供的解决方案实际上是有帮助的。【参考方案2】:

我在使用最新版本的less时遇到了这个问题。然后我切换到 2.7 版本并修复了它。

【讨论】:

我在 gulp-less 的 4.0.0 版本中遇到了同样的问题,安装旧版本也解决了这个问题。谢谢。 同样,我切换到 gulp-less 3.0.5,它对我有用【参考方案3】:

出于安全考虑,默认情况下禁用内联 JavaScript。发生的情况是,在线生成器有时会允许配置 Less 变量,然后直接解释。

这很容易受到代码注入的影响,这意味着可以将 JavaScript 注入到直接在服务器上运行的 Less 样式表中。

出于这个原因,内联 JavaScript 已被弃用(在 3.x 中默认设置为 false),取而代之的是 @plugin 语法并使用适当的 JS 插件。 - (见:http://lesscss.org/features/#plugin-atrules-feature)

是的,您仍然可以将编译选项设置为javascriptEnabled: true,但这并不是样式表的最佳做法。通常,您的样式表中不应包含 JS。最好使用插件。

【讨论】:

【参考方案4】:

对 @matthew-dean 和 @davide-carpini 所说的一切都是肯定的……但对于任何寻找 Grunt-LESS 代码 sn-p 的人来说:

  less: 
      dev: 
          options: 
              paths: ['Content/less'],
              plugins: [
                  new(require('less-plugin-autoprefix'))(
                      browsers: ['last 2 versions']
                  ),
                  new(require('less-plugin-clean-css'))(
                      sourceMap: true,
                      advanced: true
                  )
              ],
              relativeUrls: true,
              javascriptEnabled: true
          ,
          files: 
              'Content/less/site.css': 'Content/less/site.less'
          
      
  ,

这适用于我使用"grunt-contrib-less": "^2.0.0" 的实施...您的里程可能会有所不同

【讨论】:

【参考方案5】:

我遇到了同样的问题,但在 vue-cli 4 + iVueUi 主题定制中。也许有人和我有同样的烦恼。这就是解决方案:

在项目的根目录创建或使用现有的vue.config.js 文件。并将此代码(或部分添加)添加到其中。

module.exports = 
    css: 
        loaderOptions: 
            less: 
                javascriptEnabled: true
            
        
    
;

但请记住,出于安全原因,js 默认情况下是禁用的。所以这需要您自担风险。

【讨论】:

【参考方案6】:

只是为了更新接受的答案,

从 3.11.1 开始,如果你只使用options,它会抛出:

ValidationError:无效的选项对象。更少的装载机已经 使用与 API 不匹配的选项对象进行初始化 架构。 - 选项具有未知属性“javascriptEnabled”。这些属性是有效的:object lessOptions?, prependData?, appendData?,sourceMap?,实现?

在less@3.11.1中,不只是options应该使用,而是lessOptions这样:


    test: /\.less$/,
    use: [
        loader: "style-loader"
    , 
        loader: "css-loader"
    , 
        loader: "less-loader",
        options: 
          lessOptions: 
             javascriptEnabled: true
          
        
    ]

【讨论】:

【参考方案7】: 更新时间:2020 年 5 月

对于less-loader 版本6.1.0^

在“less-loader”版本 6.1.0^ 中,他们对加载器进行了重大更改,如果您使用 Ant Design(或其他 LESS 和 JS 加载器)之类的东西,您通常会将 javascriptEnabled: true 标志添加到“选项”对象在你的 Webpack 配置中。

在版本 6.1.0^ 中,此更改被放置在 less 加载器选项配置下的 lessOptions 对象中。这是我使用的解决方案,适用于我的 Webpack 配置包。

module:  rules: [
    test: /\.less$/,
    use: [
         loader: "style-loader" ,
         loader: "css-loader" ,
        
            loader: "less-loader",
            options: 
                lessOptions: 
                    javascriptEnabled: true,
                
            
        
    ]
]

请注意,javascriptEnabled 标志不在***选项对象下,而是在 lessOptions 子对象下。这是 less-loader 版本 6.1.0^ 的最新更新标准。

【讨论】:

【参考方案8】:

如果您使用的是lessc cli 界面,那么您只需要最后使用--js

lessc --js ./styles/theme.less ./styles/theme.css

【讨论】:

【参考方案9】:

当我使用cracocraco-less 并且还通过我的.less 文件自定义ant design 的变量时,像下面这样对craco.config.js 进行修正解决了我的问题:

const CracoLessPlugin = require('craco-less')

module.exports = 
    plugins: [
        
            plugin: CracoLessPlugin,
            options: 
                lessLoaderOptions: 
                    lessOptions: 
                        javascriptEnabled: true,
                    ,
                ,
            ,
        ,
    ],

【讨论】:

以上是关于在 LESS 中启用内联 javascript的主要内容,如果未能解决你的问题,请参考以下文章

VS Code:启用内联拼写检查,但在“问题”面板中禁用拼写检查

php 如果在Genesis主题中启用了JavaScript,则添加一个小内联脚本以将`js`类附加到body标记

检查父母是不是使用LESS上课

DialogFlow 内联编辑器从未启用 - Google Actions 代码实验室

如果启用优化,JIT 是不是总是内联此方法?

React:使用 Webpack 在 JSX 中内联 CSS 模块